溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Python?Tkinter?Gui運(yùn)行不卡頓的方法是什么

發(fā)布時間:2023-02-25 10:16:56 來源:億速云 閱讀:117 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹了Python Tkinter Gui運(yùn)行不卡頓的方法是什么的相關(guān)知識,內(nèi)容詳細(xì)易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇Python Tkinter Gui運(yùn)行不卡頓的方法是什么文章都會有所收獲,下面我們一起來看看吧。

    前言

    Tkinter 模塊(Tk 接口)是 Python 的標(biāo)準(zhǔn) Tk GUI 工具包的接口 .Tk 和 Tkinter 可以在大多數(shù)的 Unix 平臺下使用,同樣可以應(yīng)用在 Windows 和 Macintosh 系統(tǒng)里。Tk8.0 的后續(xù)版本可以實(shí)現(xiàn)本地窗口風(fēng)格,并良好地運(yùn)行在絕大多數(shù)平臺中,Python 使用 Tkinter 可以快速的創(chuàng)建 GUI 應(yīng)用程序,由于 Tkinter 是內(nèi)置到 python 的安裝包中、只要安裝好 Python 之后就能 import Tkinter 庫、而且 IDLE 也是用 Tkinter 編寫而成、對于簡單的圖形界面 Tkinter 還是能應(yīng)付自如。

    一、問題描述

    Python GUI程序運(yùn)行時,如果點(diǎn)擊按鈕運(yùn)行了一個比較耗時的操作,那么界面會卡死提示未響應(yīng),導(dǎo)致無法操作其他組件。

    二、解決思路

    引用線程來執(zhí)行Button按鈕綁定事件的函數(shù),現(xiàn)實(shí)運(yùn)行不卡頓,解決界面卡死。

    三、運(yùn)行效果

    Python?Tkinter?Gui運(yùn)行不卡頓的方法是什么

    四、代碼示例

    1.執(zhí)行Button按鈕綁定事件函數(shù)的線程方法

    import threading
    def thread_it(func, *args):
        """ 將函數(shù)打包進(jìn)線程 """
        self.myThread = threading.Thread(target=func, args=args)
        self.myThread .setDaemon(True)  # 主線程退出就直接讓子線程跟隨退出,不論是否運(yùn)行完成。
        self.myThread .start()

    2.完整代碼

    import sys
    import time
    import tkinter as tk
    from tkinter.messagebox import askyesno
    from tkinter.scrolledtext import ScrolledText
    import threading
    
    class TestGui(object):
        def __init__(self, init_window_name):
            self.init_window_name = init_window_name
            self.init_window_name.title("將button方法打包進(jìn)線程,現(xiàn)實(shí)運(yùn)行不卡頓測試")  # 設(shè)置窗口標(biāo)題
            self.init_window_name.geometry('700x350')  # 設(shè)置窗口大小
            """ 點(diǎn)擊右上角關(guān)閉窗體彈窗事件 """
            self.init_window_name.protocol('WM_DELETE_WINDOW', lambda: self.thread_it(self.clos_window))
            """ 組件容器創(chuàng)建 """
            self.log_frame = tk.Frame(self.init_window_name)  # 創(chuàng)建存放日志組件的容器
            self.log_frame.grid(padx=20, pady=0, row=1, column=0, sticky=tk.W)
            self.runs_button_frame = tk.Frame(self.init_window_name)  # 創(chuàng)建存放日志組件的容器
            self.runs_button_frame.grid(padx=20, pady=0, row=2, column=0, sticky=tk.W)
            """ 日志框 """
            self.run_log = ScrolledText(self.log_frame, font=('楷體', 13), width=69, height=17)
            self.run_log.grid(padx=20, pady=5, row=0, column=0)
            """ 操作按鈕 """
            self.start_run1 = tk.Button(self.runs_button_frame, text='開始打印1', font=('行楷', 15, 'bold'), fg="white", bg="#1E90FF", width=25, command=lambda: self.thread_it(self.print1))
            self.start_run1.grid(padx=20, pady=0, row=0, column=1)
            self.start_run2 = tk.Button(self.runs_button_frame, text='開始打印2', font=('行楷', 15, 'bold'), fg="white", bg="#1E90FF", width=25, command=lambda: self.thread_it(self.print2))
            self.start_run2.grid(padx=35, pady=0, row=0, column=2)
    
        def thread_it(self, func, *args):
            """ 將函數(shù)打包進(jìn)線程 """
            self.myThread = threading.Thread(target=func, args=args)
            self.myThread .setDaemon(True)  # 主線程退出就直接讓子線程跟隨退出,不論是否運(yùn)行完成。
            self.myThread .start()
    
        def print1(self):
            for i in range(100):
                tip_content = f'第{i}次打印 - 我是小洲1'
                self.run_log_print(message=tip_content)
                time.sleep(0.1)  # 睡眠
            self.run_log_print(message='我是小洲1 - 打印完成')
    
        def print2(self):
            for i in range(100, 200):
                tip_content = f'第{i}次打印 - 我是小洲2'
                self.run_log_print(message=tip_content)
                time.sleep(0.05)  # 睡眠
            self.run_log_print(message='我是小洲2 - 打印完成')
    
        def run_log_print(self, message):
            self.run_log.config(state=tk.NORMAL)
            self.run_log.insert(tk.END, "\n" + message + "\n")
            self.run_log.see(tk.END)
            self.run_log.update()
            self.run_log.config(state=tk.DISABLED)
    
        def clos_window(self):
            ans = askyesno(title='小洲助手v1.1警告', message='是否確定退出程序?\n是則退出,否則繼續(xù)!')
            if ans:
                self.init_window_name.destroy()
                sys.exit()
            else:
                return None
    
    if __name__ == '__main__':
        """ 把button方法打包進(jìn)線程,現(xiàn)實(shí)運(yùn)行不卡頓 """
        """ 實(shí)例化出一個父窗口 """
        init_window = tk.Tk()
        """ tk界面置頂 """
        init_window.attributes("-topmost", 1)
        """ 創(chuàng)建Gui類對象 """
        test_gui = TestGui(init_window)
        """ 初始化GUi組件 """
        init_window.mainloop()

    五、組件的具體使用

    注意:代碼中的關(guān)鍵部分都寫了注釋,本篇博客只是介紹了如何解決tk界面運(yùn)行卡頓的問題。

    關(guān)于“Python Tkinter Gui運(yùn)行不卡頓的方法是什么”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對“Python Tkinter Gui運(yùn)行不卡頓的方法是什么”知識都有一定的了解,大家如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道。

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI