Tkinter 主循环 mainloop

Salman Mehmood 2024年2月15日
  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
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