python 选择按钮_Python Tkinter Radiobutton和Checkbutton控件用法

Radiobutton 组件代表单选钮,该组件可以绑定一个方法或函数,当单选钮被选择时,该方法或函数将会被触发。

为了将多个 Radiobutton 编为一组,程序需要将多个 Radiobutton 绑定到同一个变量,当这组 Radiobutton 的其中一个单选钮被选中时,该变量会随之改变;反过来,当该变量发生改变时,这组 Radiobutton 也会自动选中该变量值所对应的单选钮。

下面程序示范了 Radiobutton 组件的用法:

from tkinter import * # 导入ttk from tkinter import ttk class App: def __init__(self, master): self.master = master self.initWidgets() def initWidgets(self): # 创建一个Label组件 ttk.Label(self.master, text='选择您喜欢的教程:') .pack(fill=BOTH, expand=YES) self.intVar = IntVar() # 定义元组 books = ('C语言入门', 'Python入门', 'C++入门', 'Java入门') i = 1 # 采用循环创建多个Radiobutton for book in books: ttk.Radiobutton(self.master, text = book, variable = self.intVar, # 将Radiobutton绑定到self.intVar变量 command = self.change, # 将选中事件绑定到self.change方法 value=i).pack(anchor=W) i += 1 # 设置Radiobutton绑定的变量的值为2, # 则选中value为2的Radiobutton self.intVar.set(2) def change(self): from tkinter import messagebox # 通过Radiobutton绑定变量获取选中的单选框 messagebox.showinfo(title=None, message=self.intVar.get() ) root = Tk() root.title("Radiobutton测试") App(root) root.mainloop()

上面程序使用循环创建了多个 Radiobutton 组件,程序指定将这些 Radiobutton 绑定到 self.intVar 变量,这意味着这些 Radiobutton 位于同一组内;与此同时,程序为这组 Radiobutton 的选中事件绑定了 self.change 方法,因此每次当用户选择不同的单选钮时,总会触发该对象的 change() 方法。

运行上面程序,可以看到程序默认选中第二个单选钮,这是因为第二个单选钮的 value 为 2,而程序将这组单选钮绑定的 self.intVar 的值设置为 2;如果用户改变选中其他单选钮,程序将会弹出提示框显示用户的选择项,如图 1 所示:

图 1 选中不同的单选钮

单边钮除了可以显示文本,也可以显示图片,只要为其指定 image 选项即可。如果希望图片和文字同时显示也是可以的,只要通过 compound 边项进行控制即可(如果不指定 compound 选项,该选项默认为 None,这意味着只显示图片)。如下程序示范了带图片的单选钮:

from tkinter import * # 导入ttk from tkinter import ttk class App: def __init__(self, master): self.master = master self.initWidgets() def initWidgets(self): # 创建一个Label组件 ttk.Label(self.master, text='选择您喜欢的兵种:') .pack(fill=BOTH, expand=YES) self.intVar = IntVar() # 定义元组 races = ('z.png', 'p.png','t.png') raceNames = ('虫族', '神族','人族') i = 1 # 采用循环创建多个Radiobutton for rc in races: bm = PhotoImage(file = 'images/' + rc) r = ttk.Radiobutton(self.master, image = bm, text = raceNames[i - 1], compound = RIGHT, # 图片在文字右边 variable = self.intVar, # 将Radiobutton绑定到self.intVar变量 command = self.change, # 将选中事件绑定到self.change方法 value=i) r.bm = bm r.pack(anchor=W) i += 1 # 设置默认选中value为2的单选按钮 self.intVar.set(2) def change(self): pass root = Tk() root.title("Radiobutton测试") # 改变窗口图标 root.iconbitmap('images/fklogo.ico') App(root) root.mainloop()

上面程序为 RadioButton 同时指定了 image 和 text 选项,并指定 compound 选项为 RIGHT,这意味着该单选钮的图片显示在文字的右边。运行上面程序,可以看到如图 2 所示的运行界面。

图 2 带图标的单选钮

上面程序还重新设置了窗口图标,因此在运行界面上可以看到窗口图标是自定义的图标。

Checkbutton 与 Radiobutton 很相似,只是 Checkbutton 允许选择多项,而每组 Radiobutton 只能选择一项。其他功能基本相似,同样可以显示文字和图片,同样可以绑定变量,同样可以为选中事件绑定处理函数和处理方法。但由于 Checkbutton 可以同时选中多项,因此程序需要为每个 Checkbutton 都绑定一个变量。

Checkbutton 就像开关一样,它支持两个值:开关打开的值和开关关闭的值。因此,在创建 Checkbutton 时可同时设置 onvalue 和 offvalue 选项为打开和关闭分别指定值。如果不指定 onvalue 和 offvalue,则 onvalue 默认为 1,offvalue 默认为 0。

下面程序通过两组 Checkbutton 示范了 Checkbutton 的用法:

from tkinter import * # 导入ttk from tkinter import ttk from tkinter import messagebox class App: def __init__(self, master): self.master = master self.initWidgets() def initWidgets(self): # 创建一个Label组件 ttk.Label(self.master, text='选择您喜欢的人物:') .pack(fill=BOTH, expand=YES) self.chars = [] # 定义元组 characters = ('孙悟空', '猪八戒','唐僧', '牛魔王') # 采用循环创建多个Checkbutton for ch in characters: intVar = IntVar() self.chars.append(intVar) cb = ttk.Checkbutton(self.master, text = ch, variable = intVar, # 将Checkbutton绑定到intVar变量 command = self.change) # 将选中事件绑定到self.change方法 cb.pack(anchor=W) # 创建一个Label组件 ttk.Label(self.master, text='选择您喜欢的教程:') .pack(fill=BOTH, expand=YES) # --------------下面是第二组Checkbutton--------------- self.books = [] # 定义两个元组 books = ('C语言基础教程', 'C++入门教程','Java入门教程', 'Linux教程') vals = ('C', 'C++','Java', 'Linux') i = 0 # 采用循环创建多个Checkbutton for book in books: strVar = StringVar() self.books.append(strVar) cb = ttk.Checkbutton(self.master, text = book, variable = strVar, # 将Checkbutton绑定到strVar变量 onvalue = vals[i], offvalue = '无', command = self.books_change) # 将选中事件绑定到books_change方法 cb.pack(anchor=W) i += 1 def change(self): # 将self.chars列表转换成元素为str的列表 new_li = [str(e.get()) for e in self.chars] # 将new_li列表连接成字符串 st = ', '.join(new_li) messagebox.showinfo(title=None, message=st) def books_change(self): # 将self.books列表转换成元素为str的列表 new_li = [e.get() for e in self.books] # 将new_li列表连接成字符串 st = ', '.join(new_li) messagebox.showinfo(title=None, message=st) root = Tk() root.title("Checkbutton测试") # 改变窗口图标 root.iconbitmap('favicon.ico') App(root) root.mainloop()

上面程序中第一组 Checkbutton 没有指定 onvalue 和 offvalue,因此它们的 onvalue 和 offvalue 默认分别为 1、0,所以程序将这组 Checkbutton 绑定到 IntVar 类型的变量;第二组 Checkbutton 将 onvalue 和 offvalue 都指定为字符串,因此程序将这组 Checkbutton 绑定到 StringVar 类型的变量。

运行该程序,选中“Java入门教程”选项,可以看到如图 3 所示的运行效果。

图 3 Checkbutton 组件

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值