Python嵌套函数return变量去向?Tkinter按钮回调疑问
你的return值去向问题及解决方法
你写的accept()函数里的return all_var没有任何地方接收,会直接被丢弃。Tkinter按钮的command回调机制不会处理函数的返回值——既不会把返回值存在按钮里,父函数function_1也无法直接拿到这个返回值。
几种可行的解决办法
1. 直接在回调里处理数据
不需要返回,而是在accept()里直接对收集到的变量做业务处理(比如打印、保存、调用其他函数):
def function_1(): root = Tk() var_0_ent = Entry(root) var_1_cbbx = Combobox(root, values=list_1) var_2_cbbx = Combobox(root, values=list_2) def accept(): var_0 = var_0_ent.get() var_1 = var_1_cbbx.get() var_2 = var_2_cbbx.get() all_var = (var_0, var_1, var_2) # 直接处理数据,比如打印 print(all_var) # 或者调用其他业务函数 # process_data(all_var) accept_btn = Button(root, text="确认", command=accept) var_0_ent.grid() var_1_cbbx.grid() var_2_cbbx.grid() accept_btn.grid() root.mainloop() function_1()
2. 用可变对象存储结果
利用列表这类可变对象的特性,在嵌套函数里修改它,父函数就能在窗口关闭后拿到结果:
def function_1(): root = Tk() # 定义一个空列表存结果(可变对象) result = [] var_0_ent = Entry(root) var_1_cbbx = Combobox(root, values=list_1) var_2_cbbx = Combobox(root, values=list_2) def accept(): var_0 = var_0_ent.get() var_1 = var_1_cbbx.get() var_2 = var_2_cbbx.get() all_var = (var_0, var_1, var_2) result.append(all_var) # 关闭窗口,让mainloop结束 root.destroy() accept_btn = Button(root, text="确认", command=accept) var_0_ent.grid() var_1_cbbx.grid() var_2_cbbx.grid() accept_btn.grid() root.mainloop() # 窗口关闭后,父函数可以获取结果 if result: print("收集到的变量:", result[0]) function_1()
3. 用类封装(推荐)
把界面元素和结果都封装到类里,通过实例属性来传递结果,结构更清晰:
from tkinter import Tk, Button, Entry from tkinter.ttk import Combobox class InputWindow: def __init__(self, list_1, list_2): self.root = Tk() self.result = None self.list_1 = list_1 self.list_2 = list_2 # 创建控件 self.var_0_ent = Entry(self.root) self.var_1_cbbx = Combobox(self.root, values=self.list_1) self.var_2_cbbx = Combobox(self.root, values=self.list_2) self.accept_btn = Button(self.root, text="确认", command=self.accept) # 布局控件 self.var_0_ent.grid(padx=5, pady=5) self.var_1_cbbx.grid(padx=5, pady=5) self.var_2_cbbx.grid(padx=5, pady=5) self.accept_btn.grid(padx=5, pady=10) def accept(self): # 收集变量 var_0 = self.var_0_ent.get() var_1 = self.var_1_cbbx.get() var_2 = self.var_2_cbbx.get() self.result = (var_0, var_1, var_2) # 关闭窗口 self.root.destroy() def show(self): self.root.mainloop() return self.result # 使用示例 list_1 = ["选项1", "选项2", "选项3"] list_2 = ["A", "B", "C"] window = InputWindow(list_1, list_2) all_var = window.show() print("收集到的变量:", all_var)
内容的提问来源于stack exchange,提问作者SasambaDio
相关产品推荐
相关产品推荐

