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

  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()

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值