Python跨文件变量赋值差异及Tkinter控件直接调用疑问
问题解答
问题1:跨模块变量赋值失效的原因
这是Python命名空间与对象引用机制导致的:
- 针对
number(列表,可变对象):
执行from variable import *后,main.py里的number是对variable.py中列表对象的引用。append(5)是直接在该列表对象本身做修改,并未改变引用指向,因此variable.py里的number仍指向同一个列表,调用printer()能读取到修改后的值。 - 针对
number2(None,不可变对象):number2 = 5是在main.py的命名空间里重新绑定了新变量,这个操作和variable.py里的number2无关联——原模块的number2依旧指向初始的None,所以printer2()输出原值。
若要修改number2这类不可变变量,需直接操作模块命名空间,示例代码如下:
# main.py import variable variable.number.append(5) variable.number2 = 5 variable.printer() variable.printer2()
此时运行结果会是5和5。
问题2:Tkinter控件标识的调用方式
不能直接用.!frame2.!entry.config(bg="yellow")写法,因为.!frame2.!entry只是Tkinter给控件分配的内部路径名,并非Python变量名,直接书写会触发NameError。
实现样式修改有两种可行方式:
- 直接用
winfo_children()返回的控件对象调用方法:self.frame_pm.winfo_children()[0].config(bg="yellow") - 通过Tkinter的
nametowidget()方法,将路径名转换为控件对象后调用:# 假设root为主窗口对象 root.nametowidget(".!frame2.!entry").config(bg="yellow")
内容的提问来源于stack exchange,提问作者Patrick T.
相关产品推荐
相关产品推荐

