Python GUI开发示例(Tkinter教程)

2021年9月15日04:53:43 发表评论 1,526 次浏览

在本教程中,我们将通过使用 Tkinter 包编写一些 Python GUI开发示例来学习如何开发图形用户界面。

Tkinter 包作为标准包随 Python 提供,因此我们无需安装任何东西即可使用它。

Tkinter 包是一个非常强大的包。如果你已经安装了 Python,你可以使用 IDLE,它是 Python 附带的集成 IDE,该 IDE 是使用 Tkinter 编写的。

在这个Python GUI开发教程中,我们将使用 Python 3.6,因此如果你使用的是 Python 2.x,强烈建议你切换到 Python 3.x,除非你知道语言的变化,以便你可以调整代码以使其无错误地运行。

我假设你对Python 基础知识有所了解,以帮助你了解我们在做什么。

Python Tkinter如何使用?我们将从创建一个窗口开始,然后我们将学习如何添加按钮、组合框等小部件,然后我们将使用它们的属性,本文带有完整的Python Tkinter示例代码,现在让我们开始吧。

Python Tkinter教程目录

  • 创建你的第一个 GUI 应用程序
  • 创建标签小部件
    • 设置标签字体大小
    • 设置窗口大小
  • 添加按钮小部件
    • 更改按钮前景色和背景色
    • 处理按钮点击事件
  • 使用 Entry 类(Tkinter 文本框)获取输入
    • 将焦点设置到条目小部件
    • 禁用条目小部件
  • 添加组合框小部件
  • 添加 Checkbutton 小部件(Tkinter 复选框)
    • 设置 Checkbutton 的检查状态
  • 添加单选按钮小部件
    • 获取单选按钮值(选定的单选按钮)
  • 添加一个 ScrolledText 小部件(Tkinter textarea)
    • 设置滚动文本内容
    • 删除/清除滚动文本内容
  • 创建一个消息框
    • 显示警告和错误消息
    • 显示提问对话框
  • 添加一个 SpinBox(数字小部件)
    • 设置 Spinbox 的默认值
  • 添加进度条小部件
    • 更改进度条颜色
  • 添加文件对话框(文件和目录选择器)
    • 指定文件类型(过滤文件扩展名)
  • 添加菜单栏
  • 添加 Notebook 小部件(选项卡控件)
    • 将小部件添加到笔记本
  • 为小部件添加间距(填充)

创建你的第一个 GUI 应用程序

首先,我们将导入 Tkinter 包并创建一个窗口并设置其标题,第一个Python GUI示例如下:

from tkinter import *

window = Tk()

window.title("Welcome to LikeGeeks app")

window.mainloop()

结果将是这样的:

Python GUI开发示例(Tkinter教程)

惊人的!!我们的应用程序正常工作。

最后一行调用 mainloop 函数,该函数调用窗口的无限循环,因此窗口将等待任何用户交互,直到我们关闭它。

如果你忘记调用 mainloop 函数,则用户不会看到任何内容。

创建标签小部件

为了给我们之前的例子添加一个标签,我们将使用标签类创建一个标签,如下所示:

lbl = Label(window, text="Hello")

然后我们将使用 grid 函数设置它在表单上的位置,并给它这样的位置:

lbl.grid(column=0, row=0)

所以完整的代码会是这样的:

from tkinter import *

window = Tk()

window.title("Welcome to LikeGeeks app")

lbl = Label(window, text="Hello")

lbl.grid(column=0, row=0)

window.mainloop()

这是结果:

Python GUI开发示例(Tkinter教程)

不调用标签的网格函数,它不会显示。

设置标签字体大小

你可以设置标签字体,这样你就可以把它放大,也许加粗。你还可以更改字体样式。

为此,你可以像这样传递字体参数:

lbl = Label(window, text="Hello", font=("Arial Bold", 50))
Python GUI开发示例(Tkinter教程)

请注意,字体参数可以传递给任何小部件以更改其字体,而不仅仅是标签。

太好了,但是窗口这么小,我们甚至可以看到标题,那么设置窗口大小呢?

设置窗口大小

我们可以使用几何函数设置默认窗口大小,如下所示:

window.geometry('350x200')

上面这行将窗口宽度设置为 350 像素,将高度设置为 200 像素。

让我们尝试添加更多像按钮这样的 GUI 小部件,看看如何处理按钮单击事件。

Python Tkinter教程:添加按钮小部件

让我们从将按钮添加到窗口开始,按钮的创建和添加到窗口的方式与标签相同:

btn = Button(window, text="Click Me")

btn.grid(column=1, row=0)

所以我们的窗口会是这样的,Python GUI开发示例代码如下:

from tkinter import *

window = Tk()

window.title("Welcome to LikeGeeks app")

window.geometry('350x200')

lbl = Label(window, text="Hello")

lbl.grid(column=0, row=0)

btn = Button(window, text="Click Me")

btn.grid(column=1, row=0)

结果如下所示:

Python GUI开发示例(Tkinter教程)

请注意,我们将按钮放在窗口的第二列 1 上。如果你忘记将按钮放在同一列 0 上,它将仅显示该按钮,因为该按钮将位于标签的顶部.

更改按钮前景色和背景色

你可以使用fg属性更改按钮或任何其他小部件的前景。

此外,你可以使用bg属性更改任何小部件的背景颜色。

btn = Button(window, text="Click Me", bg="orange", fg="red")
Python GUI开发示例(Tkinter教程)

现在,如果你尝试单击该按钮,则不会发生任何事情,因为该按钮的单击事件尚未写入。

Python GUI开发教程:处理按钮点击事件

首先,我们将编写按钮被点击时需要执行的函数:

def clicked():

    lbl.configure(text="Button was clicked !!")

然后我们将通过像这样指定函数来将它与按钮连接起来:

btn = Button(window, text=“Click Me”, command=clicked)

请注意,我们只输入了 clicked 而不是 clicked() 带括号。

现在完整的Python Tkinter示例代码将是这样的:

from tkinter import *

window = Tk()

window.title("Welcome to LikeGeeks app")

window.geometry('350x200')

lbl = Label(window, text="Hello")

lbl.grid(column=0, row=0)

def clicked():

    lbl.configure(text="Button was clicked !!")

btn = Button(window, text="Click Me", command=clicked)

btn.grid(column=1, row=0)

window.mainloop()

当我们点击按钮时,结果如预期:

Python GUI开发示例(Tkinter教程)

凉爽的!!

使用 Entry 类(Tkinter 文本框)获取输入

在前面的 Python GUI开发示例中,我们看到了如何添加简单的小部件,现在让我们尝试使用 Tkinter Entry 类(Tkinter 文本框)获取用户输入。

你可以使用 Tkinter Entry 类创建一个文本框,如下所示:

txt = Entry(window,width=10)

然后你可以像往常一样使用网格功能将其添加到窗口中

所以我们的窗口会是这样的:

from tkinter import *

window = Tk()

window.title("Welcome to LikeGeeks app")

window.geometry('350x200')

lbl = Label(window, text="Hello")

lbl.grid(column=0, row=0)

txt = Entry(window,width=10)

txt.grid(column=1, row=0)

def clicked():

    lbl.configure(text="Button was clicked !!")

btn = Button(window, text="Click Me", command=clicked)

btn.grid(column=2, row=0)

window.mainloop()

结果将是这样的:

Python GUI开发示例(Tkinter教程)

现在,如果你单击该按钮,它将显示相同的旧消息,那么在 Entry 小部件上显示输入的文本呢?

首先,你可以使用 get 函数获取条目文本。所以我们可以把这段代码写到我们点击的函数中,如下所示:

def clicked():

    res = "Welcome to " + txt.get()

    lbl.configure(text= res)

如果你单击该按钮并且条目小部件上有一个文本,它将显示“欢迎来到”与输入的文本连接。

这是完整的代码:

from tkinter import *

window = Tk()

window.title("Welcome to LikeGeeks app")

window.geometry('350x200')

lbl = Label(window, text="Hello")

lbl.grid(column=0, row=0)

txt = Entry(window,width=10)

txt.grid(column=1, row=0)

def clicked():

    res = "Welcome to " + txt.get()

    lbl.configure(text= res)

btn = Button(window, text="Click Me", command=clicked)

btn.grid(column=2, row=0)

window.mainloop()

运行上面的代码并检查结果:

Python GUI开发示例(Tkinter教程)

惊人的!!

每次运行代码都需要点击entry widget设置焦点才能写文字,那么自动设置焦点呢?

将焦点设置到条目小部件

这非常简单,我们需要做的就是像这样调用 focus 函数:

txt.focus()

当你运行代码时,你会注意到条目小部件具有焦点,因此你可以立即编写文本。

Python Tkinter教程:禁用条目小部件

要禁用条目小部件,你可以将状态属性设置为禁用:

txt = Entry(window,width=10, state='disabled')
Python GUI开发示例(Tkinter教程)

现在,你将无法输入任何文本。

添加组合框小部件

要添加组合框小部件,你可以使用 ttk 库中的 Combobox 类,如下所示:

from tkinter.ttk import *

combo = Combobox(window)

然后你可以将你的值添加到组合框。

from tkinter import *

from tkinter.ttk import *

window = Tk()

window.title("Welcome to LikeGeeks app")

window.geometry('350x200')

combo = Combobox(window)

combo['values']= (1, 2, 3, 4, 5, "Text")

combo.current(1) #set the selected item

combo.grid(column=0, row=0)

window.mainloop()
Python GUI开发示例(Tkinter教程)

如你所见,我们使用元组添加了组合框项。

要设置所选项目,你可以将所需项目的索引传递给当前函数。

要获取选择项,你可以像这样使用 get 函数:

combo.get()

添加 Checkbutton 小部件(Tkinter 复选框)

Python Tkinter如何使用?要创建一个 checkbutton 小部件,你可以像这样使用 Checkbutton 类:

chk = Checkbutton(window, text='Choose')

此外,你可以通过将检查值传递给 Checkbutton 来设置选中状态,如下Python GUI开发示例代码所示:

from tkinter import *

from tkinter.ttk import *

window = Tk()

window.title("Welcome to LikeGeeks app")

window.geometry('350x200')

chk_state = BooleanVar()

chk_state.set(True) #set check state

chk = Checkbutton(window, text='Choose', var=chk_state)

chk.grid(column=0, row=0)

window.mainloop()

检查结果:

Python GUI开发示例(Tkinter教程)

设置 Checkbutton 的检查状态

这里我们创建了一个 BooleanVar 类型的变量,它不是标准的 Python 变量,它是一个 Tkinter 变量,然后我们将它传递给 Checkbutton 类以将检查状态设置为上面示例中突出显示的行。

你可以将布尔值设置为 false 以取消选中它。

此外,你可以使用 IntVar 而不是 BooleanVar 并将值设置为 0 或 1。

chk_state = IntVar()

chk_state.set(0) #uncheck

chk_state.set(1) #check

这些示例给出与 BooleanVar 相同的结果。

Python GUI开发教程:添加单选按钮小部件

要添加单选按钮,只需像这样使用 RadioButton 类:

rad1 = Radiobutton(window,text='First', value=1)

请注意,你应该为每个单选按钮设置不同的值,否则它们将不起作用。

from tkinter import *

from tkinter.ttk import *

window = Tk()

window.title("Welcome to LikeGeeks app")

window.geometry('350x200')

rad1 = Radiobutton(window,text='First', value=1)

rad2 = Radiobutton(window,text='Second', value=2)

rad3 = Radiobutton(window,text='Third', value=3)

rad1.grid(column=0, row=0)

rad2.grid(column=1, row=0)

rad3.grid(column=2, row=0)

window.mainloop()

上面Python Tkinter示例代码的结果如下所示:

Python GUI开发示例(Tkinter教程)

此外,你可以将这些单选按钮中的任何一个的命令设置为特定功能,因此如果用户单击其中任何一个,它就会运行该功能代码。

这是一个例子:

rad1 = Radiobutton(window,text='First', value=1, command=clicked)

def clicked():

# Do what you need

很简单!!

获取单选按钮值(选定的单选按钮)

要获取当前选中的单选按钮或单选按钮的值,可以将可变参数传递给单选按钮,稍后就可以获取其值。

from tkinter import *

from tkinter.ttk import *

window = Tk()

window.title("Welcome to LikeGeeks app")

selected = IntVar()

rad1 = Radiobutton(window,text='First', value=1, variable=selected)

rad2 = Radiobutton(window,text='Second', value=2, variable=selected)

rad3 = Radiobutton(window,text='Third', value=3, variable=selected)

def clicked():

   print(selected.get())

btn = Button(window, text="Click Me", command=clicked)

rad1.grid(column=0, row=0)

rad2.grid(column=1, row=0)

rad3.grid(column=2, row=0)

btn.grid(column=3, row=0)

window.mainloop()
Python GUI开发示例(Tkinter教程)

每次选择单选按钮时,变量的值都会更改为所选单选按钮的值。

添加一个 ScrolledText 小部件(Tkinter textarea)

要添加 ScrolledText 小部件,你可以像这样使用 ScrolledText 类:

from tkinter import scrolledtext

txt = scrolledtext.ScrolledText(window,width=40,height=10)

这里我们指定了 ScrolledText 小部件的宽度和高度,否则,它将填满整个窗口。

from tkinter import *

from tkinter import scrolledtext

window = Tk()

window.title("Welcome to LikeGeeks app")

window.geometry('350x200')

txt = scrolledtext.ScrolledText(window,width=40,height=10)

txt.grid(column=0,row=0)

window.mainloop()

结果如你所见:

Python GUI开发示例(Tkinter教程)

设置滚动文本内容

要设置滚动文本内容,你可以使用插入方法,如下所示:

txt.insert(INSERT,'You text goes here')

删除/清除滚动文本内容

要清除滚动文本小部件的内容,你可以使用像这样的删除方法:

txt.delete(1.0,END)

伟大的!!

创建一个消息框

要使用 Tkinter 显示消息框,你可以像这样使用消息框库:

from tkinter import messagebox

messagebox.showinfo('Message title','Message content')

挺容易!!

让我们在用户单击按钮时显示一个消息框。

from tkinter import *

from tkinter import messagebox

window = Tk()

window.title("Welcome to LikeGeeks app")

window.geometry('350x200')

def clicked():

    messagebox.showinfo('Message title', 'Message content')

btn = Button(window,text='Click here', command=clicked)

btn.grid(column=0,row=0)

window.mainloop()
Python GUI开发示例(Tkinter教程)

当你单击该按钮时,将出现一个信息消息框。

显示警告和错误消息

你可以以相同的方式显示警告消息或错误消息。唯一需要改变的是消息函数

messagebox.showwarning('Message title', 'Message content')  #shows warning message

messagebox.showerror('Message title', 'Message content')    #shows error message

显示提问对话框

要向用户显示 yes no 消息框,你可以使用以下消息框功能之一:

from tkinter import messagebox

res = messagebox.askquestion('Message title','Message content')

res = messagebox.askyesno('Message title','Message content')

res = messagebox.askyesnocancel('Message title','Message content')

res = messagebox.askokcancel('Message title','Message content')

res = messagebox.askretrycancel('Message title','Message content')

你可以根据需要选择合适的消息样式。只需替换上一行中的 showinfo 函数行并运行它。

此外,你可以使用结果变量检查单击了哪个按钮

如果你单击OKyesretry,它将返回True值,但如果你选择nocancel,它将返回False

唯一返回三个值之一的函数是askyesnocancel函数,它返回True 或 False 或 None

Python Tkinter教程:添加一个 SpinBox(数字小部件)

要创建 Spinbox 小部件,你可以使用 Spinbox 类,如下所示:

spin = Spinbox(window, from_=0, to=100)

在这里,我们创建了一个 Spinbox 小部件,并传递 from_ 和 to 参数来指定 Spinbox 的数字范围。

此外,你可以使用 width 参数指定小部件的宽度:

spin = Spinbox(window, from_=0, to=100, width=5)

查看下面完整的Python GUI开发示例代码:

from tkinter import *

window = Tk()

window.title("Welcome to LikeGeeks app")

window.geometry('350x200')

spin = Spinbox(window, from_=0, to=100, width=5)

spin.grid(column=0,row=0)

window.mainloop()
Python GUI开发示例(Tkinter教程)

你可以为 Spinbox 指定数字,而不是像这样使用整个范围:

spin = Spinbox(window, values=(3, 8, 11), width=5)

这里的 Spinbox 小部件仅显示这 3 个数字,即 3、8 和 11。

设置 Spinbox 的默认值

要设置 Spinbox 默认值,你可以将值传递给 textvariable 参数,如下所示:

var =IntVar()

var.set(36)

spin = Spinbox(window, from_=0, to=100, width=5, textvariable=var)

现在,如果你运行该程序,它将显示 36 作为 Spinbox 的默认值。

添加进度条小部件

要创建进度条,你可以像这样使用 progressbar 类:

from tkinter.ttk import Progressbar

bar = Progressbar(window, length=200)

你可以像这样设置进度条值:

bar['value'] = 70

你可以根据你想要的任何过程设置此值,例如下载文件或完成任务。

更改进度条颜色

更改 Progressbar 颜色有点棘手,但超级简单。

首先,我们将创建一个样式并设置背景颜色,最后将创建的样式设置为 Progressbar。

检查以下示例:

from tkinter import *

from tkinter.ttk import Progressbar

from tkinter import ttk

window = Tk()

window.title("Welcome to LikeGeeks app")

window.geometry('350x200')

style = ttk.Style()

style.theme_use('default')

style.configure("black.Horizontal.TProgressbar", background='black')

bar = Progressbar(window, length=200, style='black.Horizontal.TProgressbar')

bar['value'] = 70

bar.grid(column=0, row=0)

window.mainloop()

结果将是这样的:

Python GUI开发示例(Tkinter教程)

Python GUI开发教程:添加文件对话框(文件和目录选择器)

要创建文件对话框(文件选择器),你可以像这样使用 filedialog 类:

from tkinter import filedialog

file = filedialog.askopenfilename()

选择文件并单击打开后,文件变量将保存该文件路径。

此外,你可以请求多个文件,如下所示:

from tkinter import filedialog

file = filedialog.askopenfilename()

指定文件类型(过滤文件扩展名)

你可以使用 filetypes 参数为文件对话框指定文件类型,只需在元组中指定扩展名。

file = filedialog.askopenfilename(filetypes = (("Text files","*.txt"),("all files","*.*")))

你可以使用 askdirectory 方法请求目录:

dir = filedialog.askdirectory()

你可以通过指定 initialdir 来指定文件对话框的初始目录,如下所示:

from os import path

file = filedialog.askopenfilename(initialdir= path.dirname(__file__))

简单!!

添加菜单栏

要添加菜单栏,你可以使用如下菜单类:

from tkinter import Menu

menu = Menu(window)

menu.add_command(label='File')

window.config(menu=menu)

首先,我们创建一个菜单,然后添加第一个标签,最后将菜单分配给我们的窗口。

你可以使用 add_cascade() 函数在任何菜单下添加菜单项,如下所示:

menu.add_cascade(label='File', menu=new_item)

所以我们的代码会是这样的:

from tkinter import *

from tkinter import Menu

window = Tk()

window.title("Welcome to LikeGeeks app")

menu = Menu(window)

new_item = Menu(menu)

new_item.add_command(label='New')

menu.add_cascade(label='File', menu=new_item)

window.config(menu=menu)

window.mainloop()
Python GUI开发示例(Tkinter教程)

使用这种方式,你可以根据需要添加许多菜单项。

from tkinter import *

from tkinter import Menu

window = Tk()

window.title("Welcome to LikeGeeks app")

menu = Menu(window)

new_item = Menu(menu)

new_item.add_command(label='New')

new_item.add_separator()

new_item.add_command(label='Edit')

menu.add_cascade(label='File', menu=new_item)

window.config(menu=menu)

window.mainloop()
Python GUI开发示例(Tkinter教程)

在这里,我们添加另一个名为 Edit 的菜单项,带有菜单分隔符。

你可能会注意到开头有一条虚线,好吧,如果你单击该线,它将在一个单独的小窗口中显示菜单项。

你可以通过禁用撕裂功能来禁用此功能,如下所示:

new_item = Menu(menu, tearoff=0)

只需将上面示例中的 new_item 替换为这个,它就不会再显示虚线了。

我不需要提醒你,你可以通过指定 command 属性来键入在用户单击任何菜单项时有效的任何代码。

new_item.add_command(label='New', command=clicked)

添加 Notebook 小部件(选项卡控件)

要创建选项卡控件,需要执行 3 个步骤。

  • 首先,我们使用 Notebook 类创建一个选项卡控件
  • 使用 Frame 类创建一个选项卡。
  • 将该选项卡添加到选项卡控件。
  • 打包选项卡控件,使其在窗口中可见。
from tkinter import *

from tkinter import ttk

window = Tk()

window.title("Welcome to LikeGeeks app")

tab_control = ttk.Notebook(window)

tab1 = ttk.Frame(tab_control)

tab_control.add(tab1, text='First')

tab_control.pack(expand=1, fill='both')

window.mainloop()
Python GUI开发示例(Tkinter教程)

你可以以相同的方式根据需要添加多个选项卡。

将小部件添加到笔记本

创建选项卡后,你可以通过将父属性分配给所需选项卡来将小部件放在这些选项卡中,Python Tkinter示例代码如下:

from tkinter import *

from tkinter import ttk

window = Tk()

window.title("Welcome to LikeGeeks app")

tab_control = ttk.Notebook(window)

tab1 = ttk.Frame(tab_control)

tab2 = ttk.Frame(tab_control)

tab_control.add(tab1, text='First')

tab_control.add(tab2, text='Second')

lbl1 = Label(tab1, text= 'label1')

lbl1.grid(column=0, row=0)

lbl2 = Label(tab2, text= 'label2')

lbl2.grid(column=0, row=0)

tab_control.pack(expand=1, fill='both')

window.mainloop()
Python GUI开发示例(Tkinter教程)

Python Tkinter教程:为小部件添加间距(填充)

你可以使用 padx 和 pady 属性为控件添加填充以使其看起来井井有条。

只需将 padx 和 pady 传递给任何小部件并给它们一个值。

lbl1 = Label(tab1, text= 'label1', padx=5, pady=5)

就这么简单!!

Python Tkinter如何使用?在本Python GUI开发教程中,我们看到了许多使用 Tkinter 库的 Python GUI开发示例,并且看到了使用它开发图形界面是多么容易。

本教程涵盖了 Python GUI 开发的主要方面,而不是全部。没有教程或一本书可以涵盖所有内容。

我希望你觉得这些例子很有用,如有问题,请在下方评论。

谢谢阅读。

木子山

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: