获取Checkbutton状态

61 投票
4 回答
160607 浏览
提问于 2025-04-16 07:24

我怎么才能获取一个 Tkinter Checkbutton'state' 呢?这里的 'state' 是指它里面是否有勾选标记。

4 个回答

1

bitsmack的回答和我看到的情况不太一致。

当选中时,chk.state()返回一个包含两个元素的元组:('focus','selected')

import tkinter as tk
from tkinter import ttk
def p(event):
    st = ck.state()
    print (f'is tuple {type(st) is tuple}  {len(st)}-----------------------------------------')
    if 'selected' in st:
        print ('got selected')
    for i,pst in enumerate(st) :
        print(f'{i}, {pst}')

    
root = tk.Tk()
root.geometry('200x200+300+200')
root.grid_rowconfigure(0, weight = 1)

ck = ttk.Checkbutton(root,text = 'tryme')
ck.grid()
root.bind('<Return>',p)
root.mainloop()

得到的结果是:

是元组 True 1----------------------------------------

0, alternate

是元组 True 2-----------------------------------------

得到了选中状态

0, focus

1, selected

是元组 True 1-----------------------------------------

0, focus

所以,要判断复选框是否被选中:

if 'selected' in chk.state()

对于alternate:

if 'alternate' in chk.state()

对于未选中:

if not ('selected' in chk.state or 'alternate' in chk.state)
55

如果你使用 tkinter 的新* ttk 模块,你可以在不指定变量的情况下读取和写入复选框的状态。

import tkinter
from tkinter import ttk
tkwindow = tkinter.Tk()
chk = ttk.Checkbutton(tkwindow, text="foo")
chk.grid(column=0, row=0)

注意,新复选框默认是“交替”状态,有时候也叫“半选中”状态:

alternate

你可以通过 .state() 方法来读取当前状态:

>>> print(chk.state())  # half-checked
('alternate',)
>>> print(chk.state())  # checked
('selected',)
>>> print(chk.state())  # not checked
()

如果你想在代码中设置状态,可以这样做:

chk.state(['selected'])  # check the checkbox
chk.state(['!selected']) # clear the checkbox
chk.state(['disabled'])  # disable the checkbox
chk.state(['!disabled','selected']) # enable the checkbox and put a check in it!

还有一种方便的方法可以检查特定的状态:

chk.instate(['selected'])  # returns True if the box is checked

我发现有两个比较棘手的地方:

  1. 初始状态是“交替”,而这个状态标志在添加“选中”状态标志时不会被清除。所以,如果你想在代码中切换复选框的状态,首先需要清除“交替”标志:

    chk.state(['!alternate'])
    
  2. 如果你使用以下方法来禁用/启用复选框:

    chk.state(['disabled'])
    chk.state(['!disabled'])
    

    那么一切都能正常工作。但是,如果你使用这些常见的、替代的方法:

    chk.config(state=tk.DISABLED)
    chk.config(state=tk.NORMAL)
    

    那么它会重新设置“交替”标志。

    如果你给复选框指定了一个变量,这种情况就不会发生,但如果你想指定一个变量,那么这个回答可能对你没什么帮助 :)


* ttk 在 Python 2.7(Tk 8.5)中可用。这个 问题 讨论了旧标准控件和新“主题”控件之间的区别。

74

当你创建这个东西的时候,需要一个叫做 variable 的参数。你可以传入一个来自 TkinterIntVar。勾选或取消勾选这个框会把 var 里面的值设置成对应的真假状态。你可以通过 var.get() 来获取这个值:

如果勾选了 => var.get()

如果没有勾选 => not var.get()

>>> root = Tkinter.Tk()
>>> var = Tkinter.IntVar()
>>> chk = Tkinter.Checkbutton(root, text='foo', variable=var)
>>> chk.pack(side=Tkinter.LEFT)
>>> var.get()  #unchecked
0
>>> var.get()  #checked
1

撰写回答