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

Python跨脚本传递tkinter输入值:报错及重复运行问题求助

问题:在两个Tkinter脚本间传递输入框值并避免窗口重复打开

原始代码

Script1.py

import tkinter as tk

def button_click():
    exec(open("script2.py").read())
    
def main():
    global entry_field
    root = tk.Tk()
    entry_field = tk.Entry(root)
    entry_field.pack()

    button = tk.Button(root, text="Click me!", command=button_click)
    button.pack()  

    root.mainloop()
    
if __name__ == "__main__":
    main()

Script2.py

import tkinter as tk
import script1

root = tk.Tk()

label = tk.Label(root, text=script1.entry_field.get())
label.pack()

root.mainloop()

问题现象

  • 运行Script1点击按钮时触发报错:
Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Users\User\AppData\Local\Programs\Python\Python311\Lib\tkinter\__init__.py", line 1948, in __call__
    return self.func(*args)
           ^^^^^^^^^^^^^^^^
  File "c:\Users\User\Desktop\Skaala\Skaala project\Test folder\script1.py", line 4, in button_click
    exec(open("script2.py").read())
  File "<string>", line 6, in <module>
AttributeError: module 'script1' has no attribute 'entry_field'
  • 移除if __name__ == "__main__"语句后,虽能获取输入值,但Script1运行时会打开两个窗口——因为Script2导入Script1时会重新执行整个脚本。

问题分析

  1. 报错原因:entry_field是在main()函数内定义的全局变量,仅当Script1作为主程序运行时才会执行main()初始化该变量;Script2导入Script1时,entry_field未被初始化,因此触发属性不存在的错误。
  2. 窗口重复打开:移除if __name__ == "__main__"后,Script2导入Script1时会直接执行main(),导致额外创建一个窗口。

解决方案

方案1:通过参数传递值,避免循环依赖

修改两个脚本的结构,将输入值直接作为参数传递给Script2的显示逻辑,无需Script2导入Script1:

Script1.py

import tkinter as tk
import script2

def button_click():
    input_value = entry_field.get()
    script2.show_value(input_value)
    
def main():
    global entry_field
    root = tk.Tk()
    entry_field = tk.Entry(root)
    entry_field.pack()

    button = tk.Button(root, text="Click me!", command=button_click)
    button.pack()  

    root.mainloop()
    
if __name__ == "__main__":
    main()

Script2.py

import tkinter as tk

def show_value(value):
    root = tk.Tk()
    label = tk.Label(root, text=value)
    label.pack()
    root.mainloop()

方案2:通过函数封装值获取逻辑,避免导入时触发窗口创建

保留导入方式,但通过函数封装值的获取逻辑,同时确保Script2导入时不会触发Script1的窗口初始化:

Script1.py

import tkinter as tk

entry_field = None

def get_input_value():
    return entry_field.get() if entry_field else ""

def button_click():
    import script2
    script2.show_label()
    
def main():
    global entry_field
    root = tk.Tk()
    entry_field = tk.Entry(root)
    entry_field.pack()

    button = tk.Button(root, text="Click me!", command=button_click)
    button.pack()  

    root.mainloop()
    
if __name__ == "__main__":
    main()

Script2.py

import tkinter as tk
import script1

def show_label():
    root = tk.Tk()
    label = tk.Label(root, text=script1.get_input_value())
    label.pack()
    root.mainloop()

以上两种方案均可实现输入值的传递,同时避免窗口重复打开的问题。

内容的提问来源于stack exchange,提问作者Vitaliy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 18:01:20