tkinter类中字典存储方法的创建位置与访问问题求助
问题分析与修复方案
核心错误点
- 局部变量未绑定到实例:
indication和mainframe是__init__内的局部变量,format方法无法直接访问,需改为实例属性(添加self.前缀)。 - 循环变量使用错误:遍历字典时,应直接使用循环得到的
key和value,而非self.indication.key这类错误写法。 - 未定义变量
n:创建单选按钮时的row = n+1中,n未初始化,需先定义行号初始值。 - 方法命名冲突:
format是Python内置函数,虽不直接报错,但建议改为语义明确的名称,避免混淆。
修复后的完整代码
import tkinter as tk from tkinter import ttk from tkinter import * class EnoxDoseCalculator: def __init__(self, root): root.title('Enoxaparin Dose Calculator') # 将indication设为实例属性,供其他方法访问 self.indication = {'VTE': self.vte, 'Atrial Fibrilation': self.af, 'Mechanical Heart valve': self.mech} # 将mainframe设为实例属性 self.mainframe = ttk.Frame(root) self.mainframe.grid(column = 0, row = 0, sticky='nsew') test_button = ttk.Button(self.mainframe, text= 'Push Mew!!', command = self.create_radiobuttons) test_button.grid(row = 0, column = 0) def vte(self): print("VTE选项触发") def af(self): print("房颤选项触发") def mech(self): print("机械心脏瓣膜选项触发") # 重命名方法,规避与内置函数冲突 def create_radiobuttons(self): self.var3 = tk.StringVar() # 初始化行号,从测试按钮的下一行开始 row_num = 1 for key, method in self.indication.items(): ttk.Radiobutton( self.mainframe, text=key, variable=self.var3, value=key, command=method ).grid(row=row_num, column=0, sticky='nswe') row_num += 1 root = Tk() EnoxDoseCalculator(root) root.mainloop()
关键修改说明
- 给
indication和mainframe添加self.前缀,转为实例属性,确保所有方法都能访问。 - 循环中直接使用遍历得到的
key(单选按钮显示文本)和method(触发的方法),修正变量调用错误。 - 新增
row_num变量控制单选按钮的行位置,从测试按钮的下一行开始排列。 - 将
format方法重命名为create_radiobuttons,避免与Python内置函数冲突,提升代码可读性。
内容的提问来源于stack exchange,提问作者Lord_Amenegg
相关产品推荐
相关产品推荐

