Tkinter 執行緒

Salman Mehmood 2023年1月30日
  1. 在 Tkinter 中處理單執行緒
  2. 在 Tkinter 中處理多執行緒
Tkinter 執行緒

本教程展示瞭如何在 Tkinter 中處理單執行緒和多執行緒。

在 Tkinter 中處理單執行緒

Python 提供了許多用於建立 GUI(圖形使用者介面)的選項。在所有的 GUI 模組中,Tkinter 是使用最廣泛的。

Tkinter 模組是在 Python 中建立 GUI 應用程式的最佳且簡單的方法。在建立 GUI 時,我們可能需要在後端執行多個任務或操作。

假設我們要同時進行多工;當我們在執行最後一個任務之前分配下一個任務時,就會出現問題。因為在後端,每一個任務都是一個接一個的執行。

在單個任務期間,GUI 視窗也不會移動,這就是我們需要在 Tkinter 中進行執行緒化的原因。

不使用 threading 的示例:

from tkinter import *
import time
from random import randint

# Initialize a new window
root = Tk()
root.geometry("500x400")
# A function that interrupts for five seconds


def five_seconds():
    time.sleep(5)

    label.config(text="5 seconds up!")


# A function that generates a random number
def random_numbers():
    rand_label.config(text=f"The random number is: {randint(1,100)}")


label = Label(root, text="Hello there!")
label.pack(pady=20)
# A button that calls a function
button1 = Button(root, text="5 seconds", command=five_seconds)
button1.pack(pady=20)

button2 = Button(root, text="pick a random number", command=random_numbers)
button2.pack(pady=20)
rand_label = Label(root, text="")
rand_label.pack(pady=20)
root.mainloop()

沒有穿線

如你所見,如果我們不使用 threading,我們必須等待執行下一個任務。

這樣整個程式就卡住了,直到最後一個任務執行完成。

Python 有一個內建的 threading 庫來處理這種情況。

import threading
from tkinter import *
import time
from random import randint

# Initialize a new window
root = Tk()
root.geometry("500x400")
# A function that interrupts for five seconds


def five_seconds():
    time.sleep(5)

    label.config(text="5 seconds up!")


# A function that generates a random number
def random_numbers():
    rand_label.config(text=f"The random number is: {randint(1,100)}")


label = Label(root, text="Hello there!")
label.pack(pady=20)
# A button that calls a function
button1 = Button(
    root, text="5 seconds", command=threading.Thread(target=five_seconds).start()
)
button1.pack(pady=20)

button2 = Button(root, text="pick a random number", command=random_numbers)
button2.pack(pady=20)
rand_label = Label(root, text="")
rand_label.pack(pady=20)
root.mainloop()

檢視與執行緒的區別。

單執行緒

button1 = Button(
    root, text="5 seconds", command=threading.Thread(target=five_seconds).start()
)

在這行程式碼中,我們使用了 Thread() 類。

Thread() 類有一個 target 選項,它將函式作為值。start() 方法有助於啟動執行緒。

在 Tkinter 中處理多執行緒

from threading import *
from tkinter import *
from time import *

# Declare an instance of TK class
win = Tk()
win.geometry("400x400")
# Declare an instance of canvas class
cnv = Canvas(win, height=300, width=300)
cnv.pack()
# This class takes threading as an argument


class FirstOval(Thread):
    def run(self):
        sleep(1)
        for i in range(1, 4):
            # Create oval
            cnv.create_oval(10 * i, 10 * i, 100, 35 * i, outline="blue", width=2)
            sleep(2)


class SecondOval(Thread):
    def run(self):
        sleep(1)
        for i in range(1, 4):
            # Create oval
            cnv.create_oval(50 * i, 10 * i, 200, 35 * i, outline="red", width=2)
            sleep(2)


# Create an object
first_oval = FirstOval()
first_oval.start()
second_oval = SecondOval()
second_oval.start()
win.mainloop()

現在我們正在使用多執行緒。注意 FirstOvalSecondOval 類;它們將 Thread 作為引數並在 run() 方法的幫助下同時執行。

run() 方法會自動執行,程式碼包含在其中。

多執行緒

作者: Salman Mehmood
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