Tkinter笔记(1.7-1.8)
1.7 Checkbutton复选按钮
Checkbutton控件用于为多个选项提供开关选择。不像radiobutton控件,选项之间并没有交互关系。可以为checkbutton加载文本或者图片。Checkbutton通常用一个IntVar分配到variable选项,来确定其状态。另外,也可以为Checkbutton分配callback函数,每当按钮被按下时,调用此函数。
class GUI:
def __init__(self, master):
# 两个Checkbutton,各有自己的Var对象,这里用一个list存两个Var。
self.sv = []
self.sv.append(tk.StringVar())
self.sv.append(tk.StringVar())
# 分别设置两个Checkbutton的on值和off值,并且与Var对象做关联
cb1 = tk.Checkbutton(master, text='checkbutton1',
onvalue='cb1 on',
offvalue='cb1 off',
variable=self.sv[0])
cb1.pack()
cb2 = tk.Checkbutton(master, text='checkbutton2',
onvalue='cb2 on',
offvalue='cb2 off',
variable=self.sv[1])
cb2.pack()
# 初始化Var对象
self.sv[0].set('cb1 start')
self.sv[1].set('cb2 start')
# 搞一个按钮来输出Var对象的值
btn = tk.Button(master, text='ok',
width=30,
command=self.sitrep)
btn.pack()
def sitrep(self):
for i in self.sv:
print(i.get())
print('\n')
Checkbutton和Radiobutton的最大区别在于,前者的选择不是互斥的,每个对象的状态对其他对象没有影响。因此,每一个对象都必须有一个独立的Var对象作为后台。依靠选择on或off,改变这个Var的值。实际上是为on和off的两种状态选择值,再将此值传入Var对象,所以类型上要注意。看上去用IntVar或BooleanVar就足够了,但是这里还是用了StringVar。
1.8 Menu菜单
菜单控件为用户提供了熟悉的操作方式,用以访问应用程序的各种功能。菜单构建起来比较麻烦,特别是当悬挂层次多的时候更是如此。所以不论要访问何种功能,菜单层次不要超过3层。关于Menu的运用,PTP教材的确已经过时了,从tkinter官方文档中可知,
-
菜单的核心是Menu类,基于toplevel或root创建Menu对象,即可得到菜单栏,如:menubar = tk.Menu(root)。而基于上一级Menu对象,创建Menu对象,即可得到具有层次关系的多级菜单。
-
调用Menu对象的add_command方法,可以为本级菜单添加选项。
-
调用Menu对象的add_cascade方法,可以在本级菜单中添加次级菜单的入口(设置级联关系)
-
完成了整个菜单的构造之后,要将菜单所在窗口的menu选项中,设置菜单栏的句柄。
import tkinter as tk root = tk.Tk() def optionclicked(): print('option clicked!') # 基于root(或者toplevel对象)建立菜单栏对象 mbar = tk.Menu(root) # 基于菜单栏对象,建立一级菜单 menu_1 = tk.Menu(mbar, tearoff=0) menu_2 = tk.Menu(mbar, tearoff=0) menu_3 = tk.Menu(mbar, tearoff=0) # 基于一级菜单,建立次级子菜单,这里准备将子菜单入口安排到第二个菜单的第一项。 menu_2_1 = tk.Menu(menu_2, tearoff=0) # 开始设置级联关系,第一级菜单是菜单栏的级联,用选项menu设定对应的菜单对象 mbar.add_cascade(label='M1', menu=menu_1) mbar.add_cascade(label='M2', menu=menu_2) mbar.add_cascade(label='M3', menu=menu_3) # 为菜单添加选项,设定命令响应函数 menu_1.add_command(label='option 1-1', command=optionclicked()) menu_1.add_command(label='option 1-2', command=optionclicked()) menu_1.add_command(label='option 1-3', command=optionclicked()) # 为菜单2添加级联项 menu_2.add_cascade(label='option 2-1', menu=menu_2_1) # 为子菜单添加选项 menu_2_1.add_command(label='option 2-1-1', command=optionclicked()) menu_2_1.add_command(label='option 2-1-2', command=optionclicked()) menu_2_1.add_command(label='option 2-1-2', command=optionclicked()) # 为菜单2添加普通选项 menu_2.add_command(label='option 2-2', command=optionclicked()) menu_2.add_command(label='option 2-3', command=optionclicked()) # 为菜单3添加普通选项 menu_3.add_command(label='option 3-1', command=optionclicked()) menu_3.add_command(label='option 3-2', command=optionclicked()) menu_3.add_command(label='option 3-3', command=optionclicked()) root['menu'] = mbar
root.mainloop()
函数会自动运行一次,不知是何原因。
上一篇: FM ALV 可编辑下拉框
下一篇: MFC如何修改ListBox的数据