Tkinter 主迴圈 mainloop

Salman Mehmood 2023年1月30日 2022年5月17日
  1. Python 中的 Tkinter mainloop()
  2. 在 Python 中 Tkinter mainloop() 阻塞
  3. Python 中的 Tkinter mainloop() 非阻塞
Tkinter 主迴圈 mainloop

Tkinter 被稱為用 Python 編寫的流行模組。它是建立 GUI 應用程式中最簡單的模組。

我們可以建立和視覺化許多視覺元素。mainloop() 方法在建立 GUI 介面中起著最重要的作用。

本教程描述了 mainloop() 方法的重要性,並試圖瞭解該方法背後發生了什麼。

Python 中的 Tkinter mainloop()

mainloop() 事件就像一個 while 迴圈;這將繼續執行,直到使用者退出。我們可以說 mainloop() 用作更新 GUI 的驅動程式。

如果沒有使用 mainloop(),視窗螢幕上不會出現任何內容。這種方法採用所有創作並具有協作響應。

以下是我們可以涉及的幾點。

  1. GUI 視窗就像一個螢幕,每微秒都在不停地破壞,但 mainloop 卻一直在抑制關閉並出現在更新的螢幕上。
  2. 新的 activity 發生時,人眼看不到破壞前一個螢幕並重新建立一個新螢幕的過程。
  3. 流程執行速度快,GUI 不會在一微秒內消失。

mainloop()TK() 類的一個方法,它幫助顯示一個 GUI 視窗。按照下面編寫的程式碼進行操作。

from tkinter import *
# Create a gui or screen
gui= Tk()
gui.title('Delftstack')
# Updates activities
gui.mainloop()

輸出:

示例 tkinter 主迴圈

在 Python 中 Tkinter mainloop() 阻塞

mainloop() 方法不斷阻塞 mainloop 之外的程式碼的原因有很多。

  1. Python 在 mainloop() 方法呼叫執行控制元件時逐行執行程式碼,一直等到使用者退出程式。
  2. mainloop() 方法不允許 Python 在 mainloop 之外執行下一次執行。

此程式碼可以輕鬆區分命令列和基於 GUI 的應用程式。

# GUI based application
from tkinter import *

gui = Tk()
gui.title('Delftstack')
gui.geometry('400x300')
gui.config(bg='DarkOliveGreen')

quit_btn=Button(
    gui,
    text='quit',
    command=lambda:gui.destroy()
)
quit_btn.pack(expand=True)

gui.mainloop()

# command line based application
age= input('Enter your age ')
print('your age is :',age)

我們可以注意到,當 Python 檔案執行時,GUI 應用程式執行,而命令列應用程式無法執行,因為命令列應用程式在程式碼之外;然而,GUI 使用 destroy() 方法退出,然後命令列應用程式執行。

輸出:

Tkinter 主迴圈阻塞

Python 中的 Tkinter mainloop() 非阻塞

在前面的示例中,我們學習瞭如何阻止 mainloop 之外的程式碼。

現在我們將演示如何在 mainloop 中使用非阻塞程式碼。

  1. 執行緒是 Python 的內建庫。該庫用於多工程序,這意味著多程序單獨執行。
  2. 大型應用程式推薦使用執行緒,但小型應用程式中的執行緒我們可以使用 after() 方法。
from tkinter import *
# create an instance of TK
gui = Tk()
gui.title('Delftstack')
gui.geometry('400x300')
gui.config(bg='DarkOliveGreen')

def AskName():
    name = input('Please type your name ')
    print('your name is: ',name)

quit_btn=Button(
    gui,
    text='Quit',
    command=lambda:gui.destroy()
)
quit_btn.pack(expand=True)
# call the function after zero second
gui.after(0, AskName)
gui.mainloop()

我們意識到,如果我們執行這段程式碼,GUI 和命令列應用程式會同時執行。

Tkinter Mainloop 非阻塞

點選這裡閱讀更多關於 mainloop 的資訊。

Salman Mehmood avatar Salman Mehmood avatar

Hello! I am Salman Bin Mehmood(Baum), a software developer and I help organizations, address complex problems. My expertise lies within back-end, data science and machine learning. I am a lifelong learner, currently working on metaverse, and enrolled in a course building an AI application with python. I love solving problems and developing bug-free software for people. I write content related to python and hot Technologies.

LinkedIn