我聽說Python中的線程不容易處理,它們變得更加和tkinter糾纏在一起。Tcl_AsyncDelete錯誤多線程Python
我有以下問題。我有兩個類,一個用於GUI,另一個用於無限處理(我必須爲這兩個類使用類)。首先,我啓動GUI類,然後啓動無限過程的類。我希望當你關閉GUI時,它也完成了無限的過程,程序結束。
代碼的簡化版本如下:
import time, threading
from tkinter import *
from tkinter import messagebox
class Interface(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
self.attrib1 = "Attrib from Interface class"
def run(self):
#Main Window
self.mainWindow = Tk()
self.mainWindow.geometry("200x200")
self.mainWindow.title("My GUI Title")
self.mainWindow.protocol("WM_DELETE_WINDOW", self.quit)
#Label
lbCommand = Label(self.mainWindow, text="Hello world", font=("Courier New", 16)).place(x=20, y=20)
#Start
self.mainWindow.mainloop()
#The Interface class contains methods that use attributes from itself and attributes from Process class.
def method1(self):
print(self.attrib1)
print(SecondThread.attrib2)
def quit(self):
if messagebox.askyesno('App','Are you sure you want to quit?'):
#In order to use quit function, mainWindow MUST BE an attribute of Interface.
self.mainWindow.destroy()
self.mainWindow.quit()
class Process(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
self.attrib2 = "Attrib from Process class"
def run(self):
global finish
while not finish:
print("Proceso infinito")
#Inside the infinite process a method from Interface class is used.
GUI.method1()
time.sleep(3)
finish = False
#Starts the GUI
GUI = Interface()
GUI.start()
#Starts the infinity process
SecondThread = Process()
SecondThread.start()
#Waits until GUI is closed
GUI.join()
print("When GUI is closed this message appears")
#When GUI is closed we set finish to True, so SecondThread will be closed.
finish = True
#After all the program should finish but it raises the error: Tcl_AsyncDelete: async handler deleted by the wrong thread
我會感謝您的幫助!
「#After所有程序要完成,但它引發的錯誤:Tcl_AsyncDelete:由錯誤的線程異步刪除處理程序」不顯示我在python3.3 Ubuntu Linux系統。 – 2014-11-22 03:54:41
看來這個錯誤只發生在Windows ..奇怪.. – 2014-11-22 05:33:42