HOWTO · Tkinter

Tkinter 主循环 mainloop

在本教程中,我们描述了 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 的信息。