在tkinter中,会经常用到Checkbutton 或者 Radiobutton 实现多选功能(单选功能一般用Listbox)。很多文章都是粗略的说了怎么实现多选选中的效果,却没有指出如何确定哪些被选中了。
当只创建一个Checkbutton时候:
v = IntVar()
Checkbutton(master=self.master, variable=v, text=text, height=2, width=10, anchor=W)\
.grid(padx=5, pady=5, ipadx=5, ipady=5, sticky=W)
要取对象是否选中,可直接通过v.get()
方法获取值判断;但若有N个Checkbutton时候,如果仍这样的处理方式,你通过v.get()
获取的值永远是最后一个Checkbutton的值。原因是变量v
被覆盖了。所以要做一个迂回操作,先将v
对象信息,保存下来,当选好后,再获取每个对象的值判断是否被选中。
代码如下:
from tkinter import *
from tkinter import messagebox
class Win_Program:
def __init__(self):
self.master = Tk()
self.master.state("zoomed") # 窗口最大化
self.master.title("demo")
self.master.grid()
self.check_buttons = list()
def create_check_buttons(self, num):
while num:
# 设置一个变量
v = IntVar()
text = "checkbutton" + str(num)
Checkbutton(master=self.master, variable=v, text=text, height=2, width=10, anchor=W)\
.grid(padx=5, pady=5, ipadx=5, ipady=5, sticky=W)
# 设置选项默认不选中
v.set(0)
# 将每个选项的对象信息存放在一个列表中
self.check_buttons.append([v, text])
num -= 1
Button(master=self.master, text="选好了", command=self.get_checked_buttons).grid()
def get_checked_buttons(self):
checked = ""
for each in self.check_buttons:
if each[0].get() == 1:
checked += each[1] + " "
messagebox.showinfo(title="选中项", message=checked)
if __name__ == "__main__":
win_program = Win_Program()
win_program.create_check_buttons(10)
mainloop()
上述方法是通用的,如果使用的是Radiobutton组件、Entry组件等,获取组件中每一个对象的信息,也都可以使用上述方法获取各组件信息。