学习Python中的GUI框架

128 阅读5分钟

Tkinter是著名的Python图形用户界面开发框架。Tkinter允许开发者在Python中建立图形用户界面,它看起来很棒,并能在所有主要的操作系统上运行。当你安装最新版本的Python时,你也会得到默认包含在该安装中的Tkinter。这意味着只要在你的代码顶部添加几个导入语句就可以开始利用Tkinter提供的功能。Tkinter的另一个很好的特点是它包括了主题GUI元素,在不同的操作系统中保持了一致的外观和感觉。让我们看看现在能不能用Tkinter建立几个简单的程序。

这里我们正在用Tkinter创建一个基本的GUI窗口。我们可以看到只需要几行代码就可以让一个窗口在我们的系统上显示。Tk()构造方法被用来创建一个顶级的窗口。这就是Tkinter应用程序的主窗口。我们把这个引用存储在变量中。然后创建一个Label(),其文本为*"Welcome to Tkinter :-)"。*这个标签是根窗口的一个子窗口。注意**pack()**方法。这是一个几何管理方法,它自动计算如何在你的应用程序中放置部件。最后,**mainloop()**方法被调用,我们得到了我们的第一个Python GUI!

from tkinter import *

root = Tk()
Label(root, text='Welcome to Tkinter :-)').pack()
root.mainloop()

tkinter root widget


创建一个新的Tkinter部件

Tk应用程序中的Widget是你在主窗口中看到的所有组件。它们作为控件与程序一起工作,如文本输入栏、按钮和标签。小部件也被用来向用户显示信息,这些不同类型的小部件都被定义为Tkinter包中的一个类。Tkinter GUI中的widget是该类的一个实例。该widget对象存储了所有与该widget相关的数据和行为。这些部件都属于一个层次结构,主窗口,在我们的例子中是根,位于层次结构的顶端。任何时候你在Tkinter中添加一个widget,都必须指定一个父对象。

Tkinter widget layout

利用这些知识,我们可以在我们的GUI中添加一个按钮,上面有一些文字。注意,这个按钮还没有做任何事情,但我们可以很快配置事件处理程序。还要注意的是,GUI的主窗口是完全可调整大小的,并且可以最大化、最小化,以及以你喜欢的方式塑造。这就像PC或Mac上的大多数桌面应用程序一样。

from tkinter import *
from tkinter import ttk

root = Tk()

button = ttk.Button(root, text='Button Text!')
button.pack()

ttk.Label(root, text='Welcome to Tkinter :-)').pack()
root.mainloop()

tkinter button widget

在Tkinter中处理按钮的点击

现在我们知道了如何在GUI中添加一个按钮,让我们看看如何在用户点击按钮时发生一些事情。这个应用程序的目标是在GUI中显示两个按钮。点击第一个按钮将显示一个1到20之间的随机偶数。点击第二个按钮将显示一个1到20之间的随机奇数。让我们看看使之工作的代码。

from tkinter import *
from tkinter import ttk
import random


class ButtonsDemo:

    def __init__(self, master):
        self.label = ttk.Label(master, text='Tkinter Root')
        self.label.grid(row=0, column=0, columnspan=2)

        ttk.Button(master, text='Even',
                   command=self.even).grid(row=1, column=0)

        ttk.Button(master, text='Odd',
                   command=self.odd).grid(row=1, column=1)

    def even(self):
        random_even = random.randrange(0, 20, 2)
        self.label.config(text=random_even)

    def odd(self):
        random_odd = random.randrange(1, 20, 2)
        self.label.config(text=random_odd)


def main():
    root = Tk()
    app = ButtonsDemo(root)
    root.mainloop()


if __name__ == '__main__': main()

这就是一个相当整洁的按钮演示。这里有几个新的概念。首先,小程序被创建为一个类,所以我们现在有一个面向对象的应用程序。其他的新概念是ttk、网格和按钮的命令。

  • [Tkinter ttk]:这些是以Tk为主题的小部件。它们非常棒,因为它们使应用程序无论在Windows、Mac还是Linux机器上运行都能看起来很好。
  • [Tk网格]:.grid()方法是使用.pack()的替代方法,可以在GUI中放置widget。
  • [命令回调]:你可以给一个widget构造函数传递第二个参数,这就是将被执行的回调。例如,对于一个Button小部件,第一个参数设置按钮的文本,第二个参数决定当它被点击时会发生什么。

Tkinter 部件配置

Tkinter应用程序中的widget是高度可配置的。我们要看的是Label小部件,因为它通常被用来向应用程序的用户显示信息。它们可以用来显示一些文字甚至是图片。这为用户提供了视觉反馈。下面是一个既有文字又有图像的Label小组件的例子。

from tkinter import *
from tkinter import ttk

root = Tk()

label = ttk.Label(root, text='The Main Tkinter Window')
label.pack()
label.config(text='This is a demo of how to configure some options on a tk widget!')
label.config(wraplength=500)
label.config(justify=CENTER)
label.config(foreground='darkgray', background='white')
label.config(font=('Open-Sans', 20, 'bold'))

logo = PhotoImage(file='python_logo.gif')
label.config(image=logo)
label.config(compound='right')

label.img = logo
label.config(image=label.img)

root.mainloop()

tkinter label text and image

在上面的代码中,我们可以看到有几个配置的选项,如文本、包装长度、对齐、前景、背景、字体等等。把上面的代码放到你自己的代码编辑器中,改变配置的值,看看结果如何。


Python Tkinter 介绍摘要

在本教程中,我们了解了一点关于Python中最流行的GUI框架,那就是Tkinter。Tkinter 使得在Python中从只有命令行脚本到为用户提供图形用户界面变得很容易,在那里他们可以与文本字段、按钮和标签交互,从程序中获得输入和输出。