Tkinter跨类调用Combobox值报错:'int'对象无对应属性
问题分析与解决方法
嘿,我来帮你理清这个问题的根源,以及怎么修复它~
核心错误原因
你遇到的 'int' object has no attribute 'comboBoxDiamUnitString' 错误,主要来自两个关键问题:
1. GPIO回调函数的参数误解
GPIO的add_event_detect方法触发回调时,默认会把触发事件的引脚编号(整数类型)作为参数传入回调函数。但你在interrupt函数里把这个参数命名为controller,导致你实际操作的是一个整数(引脚号),而不是App类的实例,自然会报错“int对象没有xxx属性”。
2. 跨页面变量访问的方式错误
即使回调参数正确,你也不能直接通过controller.comboBoxMetroVueltaString访问StartPage的Combobox值——因为controller是App类的实例,而comboBoxDiamUnitString是StartPage类实例的属性。你需要通过App类中存储所有页面实例的frames字典,来获取StartPage的实例,再访问它的变量。
另外,你的PageOne类的__init__方法还遗漏了调用父类Frame的初始化方法,这会导致Frame的基础功能异常,必须补上。
修复后的代码示例
下面是调整后的关键代码部分:
修复PageOne类
class PageOne(Frame): def __init__(self, parent, controller): # 必须调用父类Frame的初始化方法,完成Frame基础配置 Frame.__init__(self, parent) self.controller = controller # 保存controller引用,方便后续跨页面访问 self.i = 10 GPIO.setmode(GPIO.BOARD) GPIO.setup(13,GPIO.IN,pull_up_down=GPIO.PUD_UP) # 回调函数无需手动传controller,我们已在__init__中保存了引用 GPIO.add_event_detect(13, GPIO.FALLING, callback=self.interrupt, bouncetime=300) def interrupt(self, pin): # 参数pin是触发的引脚号,保留参数位置即可 # 通过controller的frames字典,获取StartPage的实例 start_page = self.controller.frames[StartPage] # 获取Combobox的选中值 selected_unit = start_page.comboBoxDiamUnitString.get() # 根据选中值执行打印逻辑 if selected_unit == "AWG": print("当前选中单位:AWG") elif selected_unit == "mm": print("当前选中单位:mm")
补充说明
- 在
PageOne的__init__中,先调用Frame.__init__(self, parent)完成Frame的初始化,这是Tkinter子类必须做的步骤。 - 把
controller保存为self.controller,这样在回调函数里就能直接访问App实例的属性了。 - 回调函数
interrupt的参数改为pin(对应GPIO传入的引脚号),如果不需要用到引脚号,可以保留参数位置但不使用它。 - 通过
self.controller.frames[StartPage]拿到StartPage的实例后,就能正常访问comboBoxDiamUnitString这个StringVar对象,调用get()获取选中值。
这样调整后,你就能在PageOne中正确获取StartPage里Combobox的选中值,并执行对应的打印逻辑了。
内容的提问来源于stack exchange,提问作者Vitoco.lr
相关产品推荐
相关产品推荐

