在 Python-Tkinter 中创建 UI

2023-09-17 22:15:45

现代计算机应用程序是用户友好的。用户交互不限于基于控制台的 I/O。得益于高速处理器和强大的图形硬件,它们具有更符合人体工程学的图形用户界面 (GUI)。这些应用程序可以通过鼠标单击接收输入,并允许用户在单选按钮、下拉列表和其他 GUI 元素(或小部件)的帮助下从替代方案中进行选择。

此类应用程序是使用各种可用的图形库之一开发的。图形库是一个软件工具包,具有定义各种 GUI 元素功能的类集合。这些图形库通常用 C/C++ 编写。其中许多已经以可导入模块的形式移植到Python。下面列出了其中一些:

Tkinter是由Fredrik Lundh开发的Tcl-Tk GUI工具包的Python端口。该模块与所有平台的 Python 标准发行版捆绑在一起。

PyQtis,Python接口到Qt,是一个非常流行的跨平台GUI框架。

PyGTK是将Python移植到另一个流行的GUI小部件工具包GTK的模块。

WxPython是另一个跨平台图形库WxWidgets的Python包装器。

本教程解释了Tkinter在开发基于GUI的Python程序中的使用。

基本图形用户界面应用程序(Basic GUI Application)

GUI 元素及其功能在 Tkinter 模块中定义。 以下代码演示了创建 UI 的步骤。

from tkinter import *
window=Tk()
# add widgets here
window.title('Hello Python')
window.geometry("300x200+10+20")
window.mainloop()

首先,导入 TKinter 模块。导入后,通过调用 Tk() 函数设置应用程序对象。 这将创建一个顶级窗口(根),其中包含一个带有标题栏的框架、带有最小化和关闭按钮的控制框以及一个用于保存其他小部件的工作区。 geometry() 方法定义框架左上角的宽度、高度和坐标,如下所示(所有值均以像素为单位): window.geometry("widthxheight+XPOS+YPOS")然后,应用程序对象通过调用 mainloop() 方法进入事件侦听循环。 应用程序现在不断等待其中元素上生成的任何事件。事件可以是在文本字段中输入的文本、从下拉列表或单选按钮中进行选择、单击/双击鼠标操作等。 应用程序的功能涉及执行适当的回调函数以响应特定类型的事件。我们将在本教程后面讨论事件处理。事件循环将在单击标题栏上的关闭按钮时终止。 上面的代码将创建以下窗口:

Python-Tkinter Window

所有 Tkinter widget 类都继承自 Widget 类。让我们添加最常用的小部件。

按钮

可以使用 Button 类创建按钮。Button 类构造函数需要对主窗口和选项的引用。

签名:Button(window, attributes)

您可以设置以下重要属性来自定义按钮:

  • text : 按钮的标题
  • BG : 背景颜色
  • FG : 前景色
  • 字体
  • :字体名称和大小
  • 图像:代替文本显示
  • 命令:单击时要调用的函数
from tkinter import *
window=Tk()
btn=Button(window, text="This is Button widget", fg='blue')
btn.place(x=80, y=100)
window.title('Hello Python')
window.geometry("300x200+10+10")
window.mainloop()

标签

可以使用 Label 类在 Python 的 UI 中创建标签。Label 构造函数需要顶级窗口对象和选项参数。 选项参数类似于按钮对象。

下面在窗口中添加一个标签。

from tkinter import *
window=Tk()
lbl=Label(window, text="This is Label widget", fg='red', font=("Helvetica", 16))
lbl.place(x=60, y=50)
window.title('Hello Python')
window.geometry("300x200+10+10")
window.mainloop()

在这里,标签的标题将使用 16 磅大小的 Helvetica 字体以红色显示。

进入

此小组件呈现一个单行文本框,用于接受用户输入。对于多行文本输入,请使用"文本"微件。 除了已经提到的属性之外,Entry 类构造函数还接受以下内容:

  • bd :文本框的边框大小;默认值为 2 像素。
  • show
  • :要将文本框转换为密码字段,请将 show 属性设置为"*"。

以下代码添加文本字段。

txtfld=Entry(window, text="This is Entry Widget", bg='black',fg='white', bd=5)

下面的示例创建一个包含按钮、标签和输入字段的窗口。

from tkinter import *
window=Tk()
btn=Button(window, text="This is Button widget", fg='blue')
btn.place(x=80, y=100)
lbl=Label(window, text="This is Label widget", fg='red', font=("Helvetica", 16))
lbl.place(x=60, y=50)
txtfld=Entry(window, text="This is Entry Widget", bd=5)
txtfld.place(x=80, y=150)
window.title('Hello Python')
window.geometry("300x200+10+10")
window.mainloop()

上面的示例将创建以下窗口。

Create UI Widgets in Python-tkinter

选择微件(Selection Widgets)

单选按钮:此小部件显示具有开/关状态的切换按钮。可能有多个按钮,但在给定时间只有一个按钮会打开。

Checkbutton:这也是一个切换按钮。矩形复选框将显示在其标题之前。它的 ON 状态由框中的刻度线显示,当单击到 OFF 时,该刻度线将消失。

组合框:这个类在tkinterpackage的ttk模块中定义。它填充集合数据类型(如元组或列表作为值参数)中的下拉数据。

列表框:与组合框不同,此小组件显示字符串项的整个集合。用户可以选择一个或多个项目。

以下示例演示了包含选择小组件的窗口:单选按钮、复选按钮、列表框和组合框:

from tkinter import *
from tkinter.ttk import Combobox
window=Tk()
var = StringVar()
var.set("one")
data=("one", "two", "three", "four")
cb=Combobox(window, values=data)
cb.place(x=60, y=150)
lb=Listbox(window, height=5, selectmode='multiple')
for num in data:
    lb.insert(END,num)
lb.place(x=250, y=150)
v0=IntVar()
v0.set(1)
r1=Radiobutton(window, text="male", variable=v0,value=1)
r2=Radiobutton(window, text="female", variable=v0,value=2)
r1.place(x=100,y=50)
r2.place(x=180, y=50)
                
v1 = IntVar()
v2 = IntVar()
C1 = Checkbutton(window, text = "Cricket", variable = v1)
C2 = Checkbutton(window, text = "Tennis", variable = v2)
C1.place(x=100, y=100)
C2.place(x=180, y=100)
window.title('Hello Python')
window.geometry("400x300+10+10")
window.mainloop()

Create UI in Python-Tkinter

事件处理(Event Handling)

事件是应用程序对象从各种 GUI 小部件接收的通知,作为用户交互的结果。应用程序对象在运行事件侦听循环时始终预测事件。用户的操作包括鼠标按钮单击或双击、在文本框内控件时按下键盘键、 某些元素增加或失焦等。

事件以<修饰符类型限定符>格式表示为字符串。

许多事件都表示为限定符。类型定义事件的类。

下表显示了 Tkinter 如何识别不同的事件:

EventModifierTypeQualifierAction
<Button-1>Button1鼠标左键单击。
<Button-2>Button2鼠标中键单击。
<Destroy>Destroy窗户正在被破坏。
<Double-Button-1>DoubleButton1双击鼠标的第一个按钮 1。
<Enter>Enter光标进入窗口。
<Expose>Expose窗口完全或部分暴露。
<KeyPress-a>KeyPressa已按下任何键。
<KeyRelease>KeyRelease任何密钥都已释放。
<Leave>Leave光标离开窗口。
<Print>Print已按下打印键。
<FocusIn>FocusIn小部件获得焦点。
<FocusOut>FocusOut小部件失去焦点。

事件应注册到应用程序中的一个或多个 GUI 小部件。如果不是,它将被忽略。在 Tkinter 中,有两种方法可以使用小部件注册事件。 第一种方法是使用 bind() 方法,第二种方法是使用 widget 构造函数中的命令参数。

绑定() 方法

bind() 方法将事件与回调函数相关联,以便在偶数发生时调用该函数。

语法:
Widget.bind(event, callback)

例如,若要在单击左键时调用 MyButtonClicked() 函数,请使用以下代码:

from tkinter import *
window=Tk()
btn = Button(window, text='OK')
btn.bind('<Button-1>', MyButtonClicked)

事件对象具有许多属性,例如源小部件,位置坐标,鼠标按钮编号和事件类型。如果需要,可以将这些传递给回调函数。

命令参数

每个小部件主要响应特定类型。例如,按钮是按钮事件的源。 因此,默认情况下它绑定到它。许多小部件类的构造函数方法都有一个称为命令的可选参数。此命令参数设置为回调函数,每当发生其绑定事件时,将调用该函数。这种方法比bind()方法更方便。

btn = Button(window, text='OK', command=myEventHandlerFunction)

在下面给出的示例中,应用程序窗口有两个文本输入字段,另一个用于显示结果。有两个按钮对象,标题为"添加"和"减去"。 用户应在两个"条目"小部件中输入数字。它们的加法或减法显示在第三个中。

第一个按钮(添加)是使用命令参数配置的。它的值是类中的add()方法。 第二个按钮使用 bind() 方法向 sub() 方法注册左按钮单击。 这两种方法都通过 Entry 小部件的 get() 方法读取文本字段的内容,解析为数字,执行加法/减法,并使用 insert() 方法在第三个文本字段中显示结果。

from tkinter import *
class MyWindow:
    def __init__(self, win):
        self.lbl1=Label(win, text='First number')
        self.lbl2=Label(win, text='Second number')
        self.lbl3=Label(win, text='Result')
        self.t1=Entry(bd=3)
        self.t2=Entry()
        self.t3=Entry()
        self.btn1 = Button(win, text='Add')
        self.btn2=Button(win, text='Subtract')
        self.lbl1.place(x=100, y=50)
        self.t1.place(x=200, y=50)
        self.lbl2.place(x=100, y=100)
        self.t2.place(x=200, y=100)
        self.b1=Button(win, text='Add', command=self.add)
        self.b2=Button(win, text='Subtract')
        self.b2.bind('<Button-1>', self.sub)
        self.b1.place(x=100, y=150)
        self.b2.place(x=200, y=150)
        self.lbl3.place(x=100, y=200)
        self.t3.place(x=200, y=200)
    def add(self):
        self.t3.delete(0, 'end')
        num1=int(self.t1.get())
        num2=int(self.t2.get())
        result=num1+num2
        self.t3.insert(END, str(result))
    def sub(self, event):
        self.t3.delete(0, 'end')
        num1=int(self.t1.get())
        num2=int(self.t2.get())
        result=num1-num2
        self.t3.insert(END, str(result))
window=Tk()
mywin=MyWindow(window)
window.title('Hello Python')
window.geometry("400x300+10+10")
window.mainloop()

上面的示例创建以下 UI。

UI in Python-Tkinter

因此,您可以使用 Python 中的 TKinter 创建 UI。

本文内容总结: