[英]Tkinter GUI and Plots and Threading
我正在嘗試使用Tkinter GUI的后台進程顯示圖。 但是,當我按一個按鈕開始該過程時,GUI“凍結”。
我已經啟用了將該函數繪制為后台進程的過程,並制作了一個GUI。 請參見下面的代碼。 我啟用了一個非常簡單的繪圖和一個非常簡單的GUI。 繪圖線程通過后台進程運行。
import tkinter as tk
from pandas import DataFrame
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import threading
def functionPlot():
Data = {'Country': ['USA', 'UK', 'CAN', 'GER', 'FR', 'FIN', 'SWE'],
'GDP_Per_Capita': [45000, 49000, 42000,56000, 47000, 58000, 57000]}
df = DataFrame(Data, columns = ['Country', 'GDP_Per_Capita'])
df = df[['Country', 'GDP_Per_Capita']].groupby('Country').sum()
print(df)
for i in range(0, 20):
print('Hello')
df['GDP_Per_Capita'].plot(kind = 'bar')
plt.ion()
def myLongProcess(isRunningFunc=None):
print("Starting My Long Process")
for i in range(1, 10):
try:
if not isRunningFunc():
self.onMyLongProcessUpdate("Stopped!")
return
except: pass
self.onMyLongProcessUpdate(i)
time.sleep(1.5)
self.onMyLongProcessUpdate("Done!")
def onMyLongProcessUpdate(status):
print("Process Update: %s" % (status, ))
class BackgroundTask():
def __init__(self, taskFuncPointer):
self.__taskFuncPointer_=taskFuncPointer
self.__workerThread_=None
self.__isRunning_=False
def taskFuncPointer(self):return self.__taskFuncPointer_
def isRunning(self):
return self.__isRunning_ and self.__workerThread_.isAlive()
def start(self):
if not self.__isRunning_:
self.__isRunning_=True
self.__workerThread_ = self.WorkerThread(self)
self.__workerThread_.start()
def stop(self): self.__isRunning_=False
class WorkerThread(threading.Thread):
def __init__(self, bgStatusTask):
threading.Thread.__init__(self)
self.__bgStatusTask_ = bgStatusTask
def run(self):
try:
self.__bgStatusTask_.taskFuncPointer()
(self.__bgStatusTask_.isRunning)
except Exception as e: print(repr(e))
self.__bgStatusTask_.stop()
root = tk.Tk()
bgStatusTask = BackgroundTask(functionPlot)
bgStatusTask.start()
menu = tk.Menu(root)
fileMenu = tk.Menu(root)
menu.add_cascade(label="File", menu=fileMenu, underline=0)
fileMenu.add_cascade(label = "Open Log File")
fileMenu.add_cascade(label = "Reset Status")
helpMenu = tk.Menu(root)
menu.add_cascade(label="Help", menu=helpMenu, underline=0)
helpMenu.add_cascade(label="Help Document")
helpMenu.add_cascade(label="About This Program")
b1 = tk.Button(root, text="Click Me!", fg="red",command=functionPlot)
b1.pack()
root.configure(menu = menu, bg = "blue")
root.geometry('400x400')
root.mainloop()
當我使用plt.show()
而不是plt.ion()
時,在外部窗口中顯示圖沒有問題
要在窗口內部顯示,請使用此代碼。 但是我刪除了線程。
import tkinter as tk
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import pandas as pd
# --- functions ---
def function_plot():
#global canvas
#global df
data = {
'Country': ['USA', 'UK', 'CAN', 'GER', 'FR', 'FIN', 'SWE'],
'GDP_Per_Capita': [45000, 49000, 42000,56000, 47000, 58000, 57000]
}
df = pd.DataFrame(data, columns = ['Country', 'GDP_Per_Capita'])
df = df[['Country', 'GDP_Per_Capita']].groupby('Country').sum()
print(df)
item = df['GDP_Per_Capita'].plot(kind='bar')
canvas = FigureCanvasTkAgg(item.figure, root)
canvas.get_tk_widget().pack()
# --- main ---
root = tk.Tk()
root.geometry('400x400')
menu = tk.Menu(root)
fileMenu = tk.Menu(root)
fileMenu.add_cascade(label="Open Log File")
fileMenu.add_cascade(label="Reset Status")
menu.add_cascade(label="File", menu=fileMenu)
helpMenu = tk.Menu(root)
helpMenu.add_cascade(label="Help Document")
helpMenu.add_cascade(label="About This Program")
menu.add_cascade(label="Help", menu=helpMenu)
root.configure(menu=menu, bg="blue")
b1 = tk.Button(root, text="Click Me!", command=function_plot)
b1.pack()
root.mainloop()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.