如何在不同模块的Tkinter弹窗间传递并返回变量?
解决Tkinter多模块弹窗返回Entry内容的问题
核心问题
不同模块的全局变量相互独立,main_popups.py里的output_variable和main.py里的不是同一个变量,而且按钮回调函数的return没法直接把值传到主模块的调用逻辑里。
最简解决方案:让弹窗函数返回输入值
利用wait_window会阻塞到弹窗关闭的特性,等弹窗销毁后,让input_box函数返回用户输入的内容,主模块直接接收这个返回值就行。
修改后的代码
main.py
from tkinter import * import main_popups as main_popups def main_screen(): screen = Tk() main_btn = Button(screen, text="Press me", command=pressed) main_btn.pack() screen.mainloop() def pressed(): # 接收弹窗返回的输入值 output_variable = main_popups.input_box(screen) print(output_variable) main_screen()
main_popups.py
def input_box(screen): input_box_screen = Toplevel(screen) output_variable = "" def btn_press(): nonlocal output_variable output_variable = entry.get() input_box_screen.destroy() entry = Entry(input_box_screen) entry.pack() btn = Button(input_box_screen, text="Confirm", command=btn_press) btn.pack() screen.wait_window(input_box_screen) # 弹窗关闭后返回输入值 return output_variable
关键改动说明
- 删掉了没必要的全局变量,用
nonlocal让嵌套的btn_press函数修改外部input_box函数里的output_variable(global会指向模块级全局变量,这里nonlocal更贴合场景)。 input_box函数末尾加了return output_variable,因为wait_window会等弹窗销毁后才继续执行,这时已经拿到了用户输入,直接返回就行。- 主模块的
pressed函数接收返回值,就能正常获取弹窗输入的内容。
进阶方案:用类封装弹窗
如果弹窗逻辑复杂,把弹窗做成类,用实例属性存输入值,主模块创建实例后读取属性值更清晰:
main_popups.py
class InputPopup: def __init__(self, parent): self.parent = parent self.output_value = "" self.create_widgets() def create_widgets(self): self.popup = Toplevel(self.parent) self.entry = Entry(self.popup) self.entry.pack() btn = Button(self.popup, text="Confirm", command=self.on_confirm) btn.pack() self.parent.wait_window(self.popup) def on_confirm(self): self.output_value = self.entry.get() self.popup.destroy()
主模块调用
def pressed(): popup = main_popups.InputPopup(screen) print(popup.output_value)
内容的提问来源于stack exchange,提问作者Honzik
相关产品推荐
相关产品推荐

