簡體   English   中英

Tkinter GUI,圖和線程

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM