我使用for循环在checkbuttons
应用中创建了tkinter
的一组(6)。到目前为止,我刚刚创建并布置了它们,但是什么也没做。我希望他们做的是告诉另一个函数如何工作,具体取决于单击哪个checkbutton
,但是当我尝试访问checkbuttons
时,出现了问题底部的错误。
我尝试将所有按钮都设置为单独的代码行,但是显然,这是很多重复的代码,所以我改为使用for循环将它们创建并存储在嵌套的dict
中,如下所示:
for i in self.atts:
self.att_buttons[i] = {}
self.att_buttons[i]["checkbutton"] = tk.Checkbutton(
self.check_frame, text=i, font=("Courier", 15),
onvalue = 1, offvalue = 0,
).pack(side=tk.LEFT)
我不确定这是正确的,但我是新手,我会尽力而为。
我有一个roll()
函数,我想要的是用于复选按钮以修改该函数的结果,所以我尝试的是
def roll(self):
"""Roll dice, add modifer and print a formatted result to the UI"""
value = random.randint(1, 6)
if self.att_buttons["Str"]["checkbutton"].get() == 1:
result = self.character.attributes["Strength"]["checkbutton].get()
self.label_var.set(f"result: {value} + {result} ")
File "main_page.py", line 149, in roll
if self.att_buttons["Str"]["checkbutton"].get() == 1:
AttributeError: 'NoneType' object has no attribute 'get'
现在,我认为这是因为我错误地调用了嵌套dict
,但是我尝试移动代码并尝试不同的代码,但仍然遇到相同的错误。
更新
基于以下hugo的答案,我已将for循环编辑为
for i in self.atts:
self.att_buttons[i] = {}
self.att_buttons[i]["checkbutton"] = tk.Checkbutton(
self.check_frame, text=i, font=("Courier", 15),
variable = tk.BooleanVar()#this is the change
)
self.att_buttons[i]["checkbutton"].pack(side=tk.LEFT)`
如何为roll()函数中的特定检查按钮调用variable
?
答案 0 :(得分:2)
self.att_buttons["Str"]["checkbutton"]
返回None
,这就是Python抱怨您试图在其上调用get()
的原因。
您写道:
for i in self.atts:
self.att_buttons[i]["checkbutton"] = ...`
检查是否确实在发生错误的行之前发生这种情况,并检查self.atts
包含"Str"
。
此外,我认为这不是获取复选框状态的正确方法-请参见Getting Tkinter Check Box State。
响应您的编辑:
您添加了一个BooleanVar,但需要保留对其的引用,因为这是您访问实际值的方式:
# Make a dict associating each att with a new BooleanVar
self.att_values = {att: tk.BooleanVar() for att in self.atts}
for i in self.atts:
self.att_buttons[i] = {}
self.att_buttons[i]["checkbutton"] = tk.Checkbutton(
self.check_frame, text=i, font=("Courier", 15),
variable = self.att_values[i]
)
self.att_buttons[i]["checkbutton"].pack(side=tk.LEFT)`
这是一个示例,您只需要保留对BooleanVar的引用即可稍后访问它们:
if self.att_values["Str"].get() == 1: