You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从另一个Python脚本调用函数且避免AttributeError?

解决Python Tkinter跨脚本传递输入值的AttributeError问题

错误原因

你遇到的AttributeError: module 'mainmenu' has no attribute 'getvalueoflist',核心原因有两点:

  1. getvalueoflist函数和e2变量都定义在mainmenu.py的if __name__ == "__main__"代码块内部。当join.py导入mainmenu模块时,模块的__name__值为"mainmenu"而非"__main__",该代码块不会执行,自然模块中不存在getvalueoflist属性。
  2. 用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 18:40:31