欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Tkinter笔记(1.7-1.8)

程序员文章站 2022-04-12 10:34:31
...

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官方文档中可知,

  1. 菜单的核心是Menu类,基于toplevel或root创建Menu对象,即可得到菜单栏,如:menubar = tk.Menu(root)。而基于上一级Menu对象,创建Menu对象,即可得到具有层次关系的多级菜单。

  2. 调用Menu对象的add_command方法,可以为本级菜单添加选项。

  3. 调用Menu对象的add_cascade方法,可以在本级菜单中添加次级菜单的入口(设置级联关系)

  4. 完成了整个菜单的构造之后,要将菜单所在窗口的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()

函数会自动运行一次,不知是何原因。

相关标签: tkinter