如何从另一个Python脚本调用函数且避免AttributeError?
解决Python Tkinter跨脚本传递输入值的AttributeError问题
错误原因
你遇到的AttributeError: module 'mainmenu' has no attribute 'getvalueoflist',核心原因有两点:
getvalueoflist函数和e2变量都定义在mainmenu.py的if __name__ == "__main__"代码块内部。当join.py导入mainmenu模块时,模块的__name__值为"mainmenu"而非"__main__",该代码块不会执行,自然模块中不存在getvalueoflist属性。- 用
subprocess.call启动join.py会创建全新的Python进程,和mainmenu.py进程完全独立——就算把函数移到代码块外,新进程里的mainmenu模块也不会共享原进程的e2输入值,这种方式本质上不可行。
正确解决方案:通过命令行参数传递值
这是跨独立进程传递简单数据最直接的方式:
1. 修改mainmenu.py的joinlobby函数
将用户输入的名字作为命令行参数传给join.py:
def joinlobby(): if (e2.index("end") == 0): tk.messagebox.showwarning("Fill the info!") else: master.withdraw() # 把输入的名字作为参数传递给join.py subprocess.call([sys.executable, "join.py", e2.get()])
2. 修改join.py,从命令行参数获取值
无需再导入mainmenu模块,直接读取命令行参数:
import tkinter as tk import sys class GUI: def __init__(self): # 补充你省略的窗口初始化代码 self.root = tk.Tk() self.lnameframe = tk.Frame(self.root) self.lnameframe.pack() # 从命令行参数获取名字,参数不足时用空字符串兜底 user_name = sys.argv[1] if len(sys.argv) > 1 else "" self.lname = tk.Label(self.lnameframe, text=user_name, font=("Times New Roman", 15), fg="Black") self.lname.pack(fill="both") self.root.mainloop() # 启动GUI if __name__ == "__main__": gui = GUI()
内容的提问来源于stack exchange,提问作者N. Tanaka
相关产品推荐
相关产品推荐

