用tkinter 写了一个窗口的程序,然后这个窗口的程序的按钮指向了另一个函数,我想在点击这个按钮的同时另一个函数开始执行,然后本函数的窗口自动关闭。
由于本窗口有三个类似按钮,用在被指向函数中写destroy()的方法行不通,(会提示不能被关闭因为已经destroyed ),且伴随空白窗口出现。
请问如何解决?
以下内容引用自GPT:
可以在被指向函数中使用Top-level窗口来代替本窗口,并在点击按钮时直接销毁本窗口,同时启动另一个线程来执行需要的函数。具体实现可以参考以下示例代码:
import tkinter as tk
import threading
class MainFrame(tk.Frame):
def __init__(self, master=None):
super().__init__(master)
self.master = master
self.create_widgets()
def create_widgets(self):
self.button1 = tk.Button(self, text="按钮1", command=self.button1_clicked)
self.button1.pack()
self.button2 = tk.Button(self, text="按钮2", command=self.button2_clicked)
self.button2.pack()
self.button3 = tk.Button(self, text="按钮3", command=self.button3_clicked)
self.button3.pack()
def button1_clicked(self):
self.start_function_thread(self.function1)
self.master.destroy()
def button2_clicked(self):
self.start_function_thread(self.function2)
self.master.destroy()
def button3_clicked(self):
self.start_function_thread(self.function3)
self.master.destroy()
def start_function_thread(self, function):
thread = threading.Thread(target=function)
thread.start()
def function1(self):
print("执行函数1")
def function2(self):
print("执行函数2")
def function3(self):
print("执行函数3")
root = tk.Tk()
app = MainFrame(master=root)
app.pack()
app.mainloop()
这里创建了一个MainFrame类作为主窗口,其中包含三个按钮和三个被指向的函数。在点击按钮时,先用start_function_thread()
方法开启一个新线程来执行相应的函数,然后调用master.destroy()
方法销毁本窗口。这样可以避免空白窗口出现以及不能使用destroy()方法的问题。
参考多线程开发,可以在触发事件的回调函数中,分别执行需要的函数和销毁主窗口的动作。具体来说,可以在回调函数中先执行需要的函数,再调用主窗口的destroy()方法来销毁窗口。这样可以保证不会出现空白窗口的问题。
import tkinter as tk
def do_something():
# 在这里执行需要的函数
def button_callback():
do_something() # 先执行do_something函数
root.destroy() # 销毁主窗口
root = tk.Tk()
button = tk.Button(root, text="按钮", command=button_callback)
button.pack()
root.mainloop()
当用户点击了按钮后,会触发button_callback()函数。该函数会先执行do_something()函数,然后再调用root.destroy()方法来销毁root所代表的主窗口。这样可以保证在执行完需要的函数之后,关闭主窗口,同时也不会出现空白窗口的情况。
大概思路就如上了,你按照你的环境试下是否可行,如果对你有帮助的花,请给我一个采纳哦,谢谢啦