Python中类文件变量无法更新并传递至主文件的求助
解决跨线程更新全局变量不生效的问题
你的代码存在三个关键问题导致变量未更新,以下是对应的修复方案:
1. 修正变量名大小写问题
var_global.py中定义的变量是BarCode1(首字母C大写),但Class_ServerThread.py和Main.py里使用的是Barcode1(首字母c小写)——这是两个完全独立的变量,你修改的是未定义的新变量,自然主文件读不到更新。
统一所有文件的变量名,比如全部使用小写c的Barcode1:
# var_global.py Barcode1 = "" Barcode2 = "" Barcode3 = "" Barcode4 = "" Barcode5 = "" Barcode6 = "" Barcode7 = ""
2. 让主线程等待子线程完成赋值
子线程启动后,主线程会立刻进入打印循环,此时子线程可能还没执行到赋值语句。可以用join()方法等待子线程完成操作后再读取变量:
# Main.py import var_global from Class_ServerThread import SocketServerThread import GPIO import time ss = SocketServerThread() ss.start() ss.join() # 等待子线程完成所有变量赋值 try: while True: print(var_global.Barcode1) # 显示100 print(var_global.Barcode2) # 显示200 print(var_global.Barcode3) # 显示300 print(var_global.Barcode4) # 显示400 print(var_global.Barcode5) # 显示500 print(var_global.Barcode6) # 显示600 print(var_global.Barcode7) # 显示700 time.sleep(1) # 避免疯狂打印 finally: GPIO.cleanup()
3. 修正语法与冗余代码
Main.py中的try语句缺少冒号:,这会直接触发语法错误,必须补上。Class_ServerThread.py里的while True循环毫无意义(内部直接break),可以直接删除循环,简化代码:
# Class_ServerThread.py import var_global from threading import Thread class SocketServerThread(Thread): def __init__(self): super().__init__() # 替代旧写法Thread.__init__(self) def run(self): var_global.Barcode1 = '100' var_global.Barcode2 = '200' var_global.Barcode3 = '300' var_global.Barcode4 = '400' var_global.Barcode5 = '500' var_global.Barcode6 = '600' var_global.Barcode7 = '700'
额外优化建议
如果有大量全局变量,用字典或类管理会比单独变量更清晰,避免大小写和维护问题:
# var_global.py barcodes = { "Barcode1": "", "Barcode2": "", "Barcode3": "", "Barcode4": "", "Barcode5": "", "Barcode6": "", "Barcode7": "" }
子线程中修改:
var_global.barcodes["Barcode1"] = '100'
主文件中读取:
print(var_global.barcodes["Barcode1"])
内容的提问来源于stack exchange,提问作者Muhammad Fahmi
相关产品推荐
相关产品推荐

