您好,登錄后才能下訂單哦!
這篇文章主要介紹了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)行不卡頓,解決界面卡死。
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()
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è)資訊頻道。
免責(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)容。