我正在 Tkinter 中嘗試多執行緒。我有一個按鈕,允許用戶使用檔案選擇器選擇 .xlsx 檔案,然后將其發送到資料庫。資料庫以資料框物件進行回應,然后通過樹視圖向用戶顯示該物件。
我有一個功能File_Dialog(treeview)
,用于此目的。當我得到檔案路徑時,我使用不同的執行緒將檔案路徑發送到資料庫。
class databaseGetDF(Thread):
def __init__(self,filepath):
super().__init__()
self.filepath = filepath
self.df = None
def run(self):
self.df = db.addCollectionData(self.filepath,True)
在我的File_Dialog(treeview)
,我這樣做,
download_thread = databaseGetDF(filename)
download_thread.start()
# I want to check now if my thread has finished
while download_thread.is_alive:
print("thread alive")
df = download_thread.df
然后,我使用樹視圖顯示 DF。問題是 while 回圈導致我的 GUI 在執行緒完成之前變得無回應。如果我不使用 while 回圈,資料庫會在單獨的回圈中更新,但 GUI 不會,因為它不等待執行緒回傳資料幀。
關于我的框架結構,我使用的是筆記本 tkinter 結構。我有一個打開檔案對話框的按鈕。
def configureHomeFrame(frame):
importButton = Button(frame, text='IMPORT DATASET (XLSX)', command=lambda: File_dialog(treeView), height=5,
width=35,
bg='#bdbdbd')
frame 屬性是一個筆記本框架。
謝謝。
uj5u.com熱心網友回復:
您可以使用.wait_variable()
函式替換 while 回圈,因為.wait_variable()
不會阻止 tkinter mainloop()
:
- 創建一個 tkinter 變數:
var1 = StringVar()
- 將此變數傳遞給
databaseGetDF
類 - 呼叫
.wait_variable(var1)
而不是 while 回圈 - 當執行緒任務完成時更新這個變數
例子:
class databaseGetDF(Thread):
def __init__(self, filepath, notify_var):
super().__init__()
self.filepath = filepath
self.notify_var = notify_var
self.df = None
def run(self):
self.df = db.addCollectionData(self.filepath, True)
# update self.notify_var
self.notify_var.set('')
...
# create a tkinter variable
var1 = StringVar()
# pass the variable to databaseGetDF class
download_thread = databaseGetDF(filename, var1)
download_thread.start()
# wait for the thread completes
root.wait_variable(var1) # assume root is the root window
# thread completed, so you can get the dataframe
df = download_thread.df
...
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/470129.html