Tkinter中OptionMenu设置变量后无法在其他函数中正确读取的问题
嗨,我来帮你捋清楚这个问题!你遇到的核心坑是Python的变量作用域,咱们一步步来拆解:
问题出在哪?
你在全局定义了p1aspVARIABLE = str(),但在tellmeP1Asp函数里直接写p1aspVARIABLE = choice时,Python会默认把这个变量当成函数内部的局部变量——也就是说,你这里修改的只是函数里临时创建的一个同名变量,和全局的那个p1aspVARIABLE完全没关系。所以当你点击button1调用tellmethevariable时,读取的还是全局变量的初始空字符串,自然不会显示你选中的选项。
两个简单的解决方案
方案一:用global声明全局变量
在tellmeP1Asp函数开头加上global p1aspVARIABLE,告诉Python:“我要修改的是全局的那个变量,不是局部新创建的”。修改后的函数代码如下:
def tellmeP1Asp(choice): global p1aspVARIABLE # 声明使用全局变量 choice = p1aspCHOICE.get() print(choice) p1aspVARIABLE = choice print(p1aspVARIABLE)
这样函数里的赋值就会作用到全局的p1aspVARIABLE上,点击按钮时就能读到正确的选中值了。
方案二:直接使用Tkinter的StringVar(更推荐)
其实你完全不需要额外维护p1aspVARIABLE这个变量,因为p1aspCHOICE本身就是Tkinter专门用来追踪控件值的StringVar对象。你可以直接在tellmethevariable函数里调用它的get()方法获取当前选中的值,这样既避免了作用域问题,也更符合Tkinter的设计逻辑:
def tellmethevariable(): current_choice = p1aspCHOICE.get() if current_choice == "AA": print(current_choice) else: print("Not 'AA'")
用这个方案的话,你甚至可以删掉一开始定义的p1aspVARIABLE = str(),代码会更简洁清爽。
小提示
刚学Python和Tkinter时,作用域问题是非常常见的踩坑点。记住:如果要在函数内部修改全局变量,必须用global声明;另外Tkinter的专属变量类型(StringVar/IntVar等)就是用来同步界面控件值的,直接用它们的get()/set()方法会比自己维护变量省心很多~
备注:内容来源于stack exchange,提问作者Archie

