52

我如何获得'state'a Tkinter Checkbutton'state'我的意思是了解它是否有复选标记。

4

3 回答 3

66

创建它时,它需要一个variable关键字参数。将其传递给IntVarfrom Tkinter。选中或取消选中该框会将包含的值设置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
于 2010-11-21T07:49:39.383 回答
40

如果您使用来自 tkinter 的新* ttk 模块,您可以在不分配变量的情况下读取和写入检查按钮状态。

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

请注意,新复选框默认为“备用”状态,有时称为“半选中”状态:

备用

您可以使用 .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. 初始状态是“alternate”,当添加“selected”状态标志时,该状态标志不会被清除。所以,如果你想在代码中切换你的检查按钮,你首先需要清除“alternate”标志:

    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) 中可用。这个问题讨论了旧标准小部件和新的“主题”小部件之间的区别。

于 2016-12-11T00:13:33.473 回答
0

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 为 tuple True 2-----------------------------------------------------

got selected 0, focus 1, selected is tuple True 1---------------------------- ---

0、专注

因此,要确定是否选中了复选框:

if 'selected' in chk.state()

备用:

if 'alternate' in chk.state()

对于未选择:

if not ('selected' in chk.state or 'alternate' in chk.state)
于 2021-01-22T22:19:14.503 回答