Python如何解决Tkinter应用未等按钮点击就提前销毁的问题
问题原因
报错的核心原因是给tk.Button的command参数传值时,错误添加了函数调用的括号():
confirm_button = tk.Button (source_url, text = 'Confirm', command = btn_click())
此处写btn_click()会在代码执行到创建按钮这一行时立刻执行btn_click函数,直接调用source_url.destroy()把窗口销毁,后续要渲染按钮时窗口已经不存在,就抛出了application has been destroyed的错误。
解决方法
直接去掉command参数里btn_click后面的括号即可,只传函数名本身作为回调对象,tkinter会在用户实际点击按钮时才自动调用这个函数:
# 修正后的按钮创建代码 confirm_button = tk.Button (source_url, text = 'Confirm', command = btn_click)
如果后续需要给回调函数传参数,可以用lambda匿名函数包裹:
# 示例:给btn_click传参的写法 confirm_button = tk.Button (source_url, text = 'Confirm', command = lambda: btn_click(参数1, 参数2))
另外原代码中btn_click的return值无法被外层接收,因为回调函数的返回值不会被tkinter框架向外传递,如果需要拿到用户选择的结果,可以把结果变量定义为外层函数的变量,在mainloop结束后返回即可,完整修正代码如下:
import tkinter as tk def main_function(): # 存储用户选择的结果 selected = None # Generate Tk class source_url = tk.Tk() # Screen size source_url.geometry ('270x100') # Screen title source_url.title ('Choose a source') # List radio button labels rdo_txt = ['A','B'] # Radio button status rdo_var = tk.IntVar () # Create and place radio buttons dynamically for i in range(len(rdo_txt)): rdo = tk.Radiobutton (source_url, value = i, variable = rdo_var, text = rdo_txt [i]) rdo.place (x = 40, y = 15 + (i * 20)) # Button click event def btn_click (): nonlocal selected selected = rdo_var.get() source_url.destroy() # Create button confirm_button = tk.Button (source_url, text = 'Confirm', command = btn_click) confirm_button.place (x = 130, y = 30) source_url.mainloop() # 主循环结束后返回用户选择的结果 return selected if __name__ == "__main__": res = main_function() print(f"用户选择了:{['A','B'][res]}")
内容的提问来源于stack exchange,提问作者user3782604
相关产品推荐
相关产品推荐

