<p>这是我的解决方案(可能可以简化,但……这是一个解决方案):</p>
<pre class="lang-py prettyprint-override"><code>from tkinter import Tk, Checkbutton, Frame, IntVar
class Options:
def __init__(self, parent, name, selection=None, select_all=False):
self.parent = parent
self.name = name
self.selection = selection
self.variable = IntVar()
self.checkbutton = Checkbutton(self.parent, text=self.name,
variable=self.variable, command=self.check)
if selection is None:
self.checkbutton.pack(side='top')
elif select_all:
self.checkbutton.config(command=self.select_all)
self.checkbutton.pack()
for item in self.selection:
item.checkbutton.pack(side='top')
def check(self):
state = self.variable.get()
if state == 1:
print(f'Selected: {self.name}')
if all([True if item.variable.get() == 1 else False for item in self.selection[:-1]]):
self.selection[-1].checkbutton.select()
elif state == 0:
print(f'Deselected: {self.name}')
if self.selection[-1].variable.get() == 1:
self.selection[-1].checkbutton.deselect()
def select_all(self):
state = self.variable.get()
if state == 1:
for item in self.selection[:-1]:
item.checkbutton.deselect()
item.checkbutton.invoke()
elif state == 0:
for item in self.selection[:-1]:
item.checkbutton.select()
item.checkbutton.invoke()
selection = []
root = Tk()
option_frame = Frame(root)
option_frame.pack(side='left', fill='y')
for i in range(5):
selection.append(Options(option_frame, f'Option {i + 1}', selection))
selection.append(Options(option_frame, 'Select All', selection, True))
root.mainloop()
</code></pre>
<p>关于如何设置的快速说明。如果有一组复选框要添加<code>select all</code>复选框,则必须将它们全部附加到列表中,并在循环中创建它们时将该列表作为第三个参数,如示例所示。然后,在循环之后,您希望附加另一个实例,但还必须将第四个参数设置为True。这将允许轻松创建带有全选的复选框。如果您只想有几个复选框,只需将它们放在一个循环中,并只添加前两个参数:parent和name</p>
<p>希望澄清如何设置。关于编码部分:</p>
<p>当在代码中取消选择全部,然后在应该选择的时候调用时,可能会出现一些混乱。原因是首先需要清除所有复选框,因为<code>.invoke()</code>会将它们切换到相反的位置,并且还会模拟用户输入,因此所有复选框都将调用<code>.check()</code>方法,而对于取消选择,则以相反的方式工作</p>
<pre class="lang-py prettyprint-override"><code>def select_all(self):
state = self.variable.get()
if state == 1:
for item in self.selection[:-1]:
item.checkbutton.deselect()
item.checkbutton.invoke()
elif state == 0:
for item in self.selection[:-1]:
item.checkbutton.select()
item.checkbutton.invoke()
</code></pre>
<p>此外,如果if all selected和一个或多个get deselected的功能被用户自动取消选中select all复选框(因为它是不真实的),代码可能会变得不那么复杂。(最后2行)</p>
<pre class="lang-py prettyprint-override"><code>elif state == 0:
print(f'Deselected: {self.name}')
if self.selection[-1].variable.get() == 1:
self.selection[-1].checkbutton.deselect()
</code></pre>
<p>编辑1:添加代码,如果用户选择了所有复选框(并且用户未选择所有复选框)(最后2行),则选中所有复选框</p>
<pre class="lang-py prettyprint-override"><code>if state == 1:
print(f'Selected: {self.name}')
if all([True if item.variable.get() == 1 else False for item in self.selection[:-1]]):
self.selection[-1].checkbutton.select()
</code></pre>
<p>我想说剩下的是非常简单的python逻辑,所以如果您有问题,可以问他们</p>
<blockquote>
<p>Here is the source I used for <a href="https://www.tutorialspoint.com/python/tk_checkbutton.htm" rel="nofollow noreferrer">Checkbox</a> attributes and methods.</p>
</blockquote>