39、Python GUI编程入门:从基础到实践

Python GUI编程入门:从基础到实践

1. 图形用户界面(GUI)概述

计算机的用户界面是用户与计算机交互的部分,它包含硬件设备(如键盘和视频显示器)以及操作系统接受用户命令的方式。过去,用户与操作系统交互的唯一方式是通过命令行界面。命令行界面通常会显示一个提示符,用户输入命令后,系统执行该命令。然而,命令行界面对于许多用户,尤其是初学者来说,使用起来较为困难,因为需要学习大量命令,且每个命令都有自己的语法。

20世纪80年代,图形用户界面(GUI)开始在商业操作系统中使用。GUI允许用户通过屏幕上的图形元素(如图标、按钮和对话框)与操作系统和其他程序进行交互。它还推广了鼠标作为输入设备的使用,用户只需指向图形元素并点击鼠标按钮即可激活它们。

在基于文本的环境(如命令行界面)中,程序决定事情发生的顺序。而在GUI环境中,用户决定事情发生的顺序,因此GUI程序是事件驱动的。用户引发事件(如点击按钮),程序必须对这些事件做出响应。

2. 使用tkinter模块创建简单GUI程序

Python本身没有内置的GUI编程功能,但它自带了一个名为 tkinter 的模块,可用于创建简单的GUI程序。 tkinter 是“Tk interface”的缩写,它为Python程序员提供了使用名为Tk的GUI库的方式。

tkinter 模块提供了15种不同的小部件,如下表所示:
| 小部件 | 描述 |
| — | — |
| Button | 点击时可触发操作的按钮 |
| Canvas | 可用于显示图形的矩形区域 |
| Checkbutton | 可以处于“开”或“关”状态的按钮 |
| Entry | 用户可以从键盘输入单行文本的区域 |
| Frame | 可以容纳其他小部件的容器 |
| Label | 显示一行文本或图像的区域 |
| Listbox | 用户可以从中选择项目的列表 |
| Menu | 用户点击Menubutton小部件时显示的菜单选项列表 |
| Menubutton | 显示在屏幕上,用户可以点击的菜单 |
| Message | 显示多行文本 |
| Radiobutton | 可以选择或取消选择的小部件,通常成组出现,允许用户从多个选项中选择一个 |
| Scale | 用户可以通过沿轨道移动滑块来选择值的小部件 |
| Scrollbar | 可与其他类型的小部件一起使用以提供滚动功能 |
| Text | 用户可以输入多行文本的小部件 |
| Toplevel | 类似于Frame,但显示在自己的窗口中 |

下面是一个使用 tkinter 模块显示空窗口的简单程序:

# This program displays an empty window.
import tkinter

def main():
    # Create the main window widget.
    main_window = tkinter.Tk()

    # Enter the tkinter main loop.
    tkinter.mainloop()

# Call the main function.
main()

上述代码中,第3行导入了 tkinter 模块。在 main 函数中,第7行创建了 tkinter 模块的 Tk 类的一个实例,并将其赋值给 main_window 变量,这个对象是根小部件,即程序中的主窗口。第10行调用了 tkinter 模块的 mainloop 函数,该函数会一直运行,直到关闭主窗口。

大多数程序员在编写GUI程序时更喜欢采用面向对象的方法。以下是一个面向对象版本的显示空窗口的程序:

# This program displays an empty window.
import tkinter

class MyGUI:
    def __init__(self):
        # Create the main window widget.
        self.main_window = tkinter.Tk()

        # Enter the tkinter main loop.
        tkinter.mainloop()

# Create an instance of the MyGUI class.
my_gui = MyGUI()

在这个程序中, MyGUI 类的 __init__ 方法创建了根小部件并调用了 mainloop 函数。当创建 MyGUI 类的实例时,GUI会显示在屏幕上。

3. 使用Label小部件显示文本

可以使用 Label 小部件在窗口中显示单行文本。以下是一个显示“Hello World!”的示例程序:

# This program displays a label with text.
import tkinter

class MyGUI:
    def __init__(self):
        # Create the main window widget.
        self.main_window = tkinter.Tk()

        # Create a Label widget containing the text 'Hello World!'
        self.label = tkinter.Label(self.main_window, text='Hello World!')

        # Call the Label widget's pack method.
        self.label.pack()

        # Enter the tkinter main loop.
        tkinter.mainloop()

# Create an instance of the MyGUI class.
my_gui = MyGUI()

在这个程序中, __init__ 方法创建了根小部件和 Label 小部件。 Label 小部件的第一个参数是根小部件的引用,第二个参数指定要显示的文本。 pack 方法用于确定小部件的位置并使其在主窗口显示时可见。

下面是显示两个 Label 小部件的示例程序:

# This program displays two labels with text.
import tkinter

class MyGUI:
    def __init__(self):
        # Create the main window widget.
        self.main_window = tkinter.Tk()

        # Create two Label widgets.
        self.label1 = tkinter.Label(self.main_window, text='Hello World!')
        self.label2 = tkinter.Label(self.main_window, text='This is my GUI program.')

        # Call both Label widgets' pack method.
        self.label1.pack()
        self.label2.pack()

        # Enter the tkinter main loop.
        tkinter.mainloop()

# Create an instance of the MyGUI class.
my_gui = MyGUI()

默认情况下,两个 Label 小部件会堆叠显示。可以通过向 pack 方法传递参数来改变布局,例如:

# This program uses the side='left' argument with the pack method to change the layout of the widgets.
import tkinter

class MyGUI:
    def __init__(self):
        # Create the main window widget.
        self.main_window = tkinter.Tk()

        # Create two Label widgets.
        self.label1 = tkinter.Label(self.main_window, text='Hello World!')
        self.label2 = tkinter.Label(self.main_window, text='This is my GUI program.')

        # Call both Label widgets' pack method.
        self.label1.pack(side='left')
        self.label2.pack(side='left')

        # Enter the tkinter main loop.
        tkinter.mainloop()

# Create an instance of the MyGUI class.
my_gui = MyGUI()

通过传递 side='left' 参数,两个 Label 小部件会并排显示。 pack 方法的有效 side 参数包括 side='top' side='bottom' side='left' side='right'

4. 使用Frame小部件组织小部件

Frame 是一个可以容纳其他小部件的容器,可用于组织窗口中的小部件。以下是一个示例程序,展示了如何使用两个 Frame 来组织 Label 小部件:

# This program creates labels in two different frames.
import tkinter

class MyGUI:
    def __init__(self):
        # Create the main window widget.
        self.main_window = tkinter.Tk()

        # Create two frames, one for the top of the window, and one for the bottom.
        self.top_frame = tkinter.Frame(self.main_window)
        self.bottom_frame = tkinter.Frame(self.main_window)

        # Create three Label widgets for the top frame.
        self.label1 = tkinter.Label(self.top_frame, text='Winken')
        self.label2 = tkinter.Label(self.top_frame, text='Blinken')
        self.label3 = tkinter.Label(self.top_frame, text='Nod')

        # Pack the labels that are in the top frame. Use the side='top' argument to stack them one on top of the other.
        self.label1.pack(side='top')
        self.label2.pack(side='top')
        self.label3.pack(side='top')

        # Create three Label widgets for the bottom frame.
        self.label4 = tkinter.Label(self.bottom_frame, text='Winken')
        self.label5 = tkinter.Label(self.bottom_frame, text='Blinken')
        self.label6 = tkinter.Label(self.bottom_frame, text='Nod')

        # Pack the labels that are in the bottom frame. Use the side='left' argument to arrange them horizontally from the left of the frame.
        self.label4.pack(side='left')
        self.label5.pack(side='left')
        self.label6.pack(side='left')

        # Pack the frames too!
        self.top_frame.pack()
        self.bottom_frame.pack()

        # Enter the tkinter main loop.
        tkinter.mainloop()

# Create an instance of the MyGUI class.
my_gui = MyGUI()

在这个程序中,创建了两个 Frame 对象,并将它们添加到主窗口中。然后在每个 Frame 中创建了三个 Label 小部件,并使用 pack 方法进行布局。最后,需要对 Frame 小部件调用 pack 方法,使其可见。

5. 按钮小部件和信息对话框

Button 小部件用于在窗口中创建标准按钮。当用户点击按钮时,会调用指定的函数或方法。信息对话框是一个简单的窗口,用于向用户显示消息,并带有一个“OK”按钮用于关闭对话框。可以使用 tkinter.messagebox 模块的 showinfo 函数来显示信息对话框。

以下是一个示例程序,展示了如何创建按钮和信息对话框:

# This program demonstrates a Button widget. When the user clicks the Button, an info dialog box is displayed.
import tkinter
import tkinter.messagebox

class MyGUI:
    def __init__(self):
        # Create the main window widget.
        self.main_window = tkinter.Tk()

        # Create a Button widget. The text 'Click Me!' should appear on the face of the Button. The do_something method should be executed when the user clicks the Button.
        self.my_button = tkinter.Button(self.main_window, text='Click Me!', command=self.do_something)

        # Pack the Button.
        self.my_button.pack()

        # Enter the tkinter main loop.
        tkinter.mainloop()

    # The do_something method is a callback function for the Button widget.
    def do_something(self):
        # Display an info dialog box.
        tkinter.messagebox.showinfo('Response', 'Thanks for clicking the button.')

# Create an instance of the MyGUI class.
my_gui = MyGUI()

在这个程序中,创建了一个按钮小部件,并指定了按钮上显示的文本和点击按钮时要执行的回调函数 do_something do_something 方法调用 tkinter.messagebox.showinfo 函数来显示信息对话框。

通常,GUI程序会有一个“退出”按钮,用于在用户点击时关闭程序。以下是创建“退出”按钮的示例程序:

# This program has a Quit button that calls the Tk class's destroy method when clicked.
import tkinter
import tkinter.messagebox

class MyGUI:
    def __init__(self):
        # Create the main window widget.
        self.main_window = tkinter.Tk()

        # Create a Button widget. The text 'Click Me!' should appear on the face of the Button. The do_something method should be executed when the user clicks the Button.
        self.my_button = tkinter.Button(self.main_window, text='Click Me!', command=self.do_something)

        # Create a Quit button. When this button is clicked the root widget's destroy method is called.
        self.quit_button = tkinter.Button(self.main_window, text='Quit', command=self.main_window.destroy)

        # Pack the buttons.
        self.my_button.pack()
        self.quit_button.pack()

        # Enter the tkinter main loop.
        tkinter.mainloop()

    # The do_something method is a callback function for the Button widget.
    def do_something(self):
        # Display an info dialog box.
        tkinter.messagebox.showinfo('Response', 'Thanks for clicking the button.')

# Create an instance of the MyGUI class.
my_gui = MyGUI()

在这个程序中,创建了一个“退出”按钮,并将根小部件的 destroy 方法作为回调函数。当用户点击“退出”按钮时,程序会关闭。

通过以上内容,我们了解了Python中使用 tkinter 模块创建简单GUI程序的基本方法,包括创建窗口、显示文本、组织小部件、使用按钮和信息对话框等。这些基础知识为进一步开发更复杂的GUI应用程序奠定了基础。

下面我们用mermaid流程图来展示创建一个简单GUI程序的基本流程:

graph TD;
    A[导入tkinter模块] --> B[创建主窗口];
    B --> C[创建小部件];
    C --> D[布局小部件];
    D --> E[进入主循环];

通过这个流程图,我们可以清晰地看到创建一个简单GUI程序的主要步骤。首先导入 tkinter 模块,然后创建主窗口,接着创建各种小部件,对小部件进行布局,最后进入主循环以保持窗口显示并响应用户操作。

Python GUI编程入门:从基础到实践

6. 使用Entry小部件获取用户输入

Entry 小部件用于让用户输入单行文本。以下是一个简单的示例程序,展示了如何使用 Entry 小部件以及如何获取用户输入的内容:

import tkinter

class MyGUI:
    def __init__(self):
        self.main_window = tkinter.Tk()

        # 创建一个Entry小部件
        self.entry = tkinter.Entry(self.main_window)
        self.entry.pack()

        # 创建一个按钮,点击时获取Entry中的内容
        self.get_button = tkinter.Button(self.main_window, text='获取输入', command=self.get_input)
        self.get_button.pack()

        tkinter.mainloop()

    def get_input(self):
        input_text = self.entry.get()
        print(f"用户输入的内容是: {input_text}")

# 创建MyGUI类的实例
my_gui = MyGUI()

在这个程序中,首先创建了一个 Entry 小部件,用户可以在其中输入文本。然后创建了一个按钮,当用户点击该按钮时,会调用 get_input 方法。在 get_input 方法中,使用 entry.get() 方法获取 Entry 小部件中的文本,并将其打印输出。

7. 使用Label作为输出字段

可以将 Label 小部件用作输出字段,以显示程序的计算结果或其他信息。以下是一个示例程序,展示了如何根据用户输入计算矩形的面积,并将结果显示在 Label 小部件中:

import tkinter

class MyGUI:
    def __init__(self):
        self.main_window = tkinter.Tk()

        # 创建用于输入长度和宽度的Entry小部件
        self.length_entry = tkinter.Entry(self.main_window)
        self.length_entry.pack()

        self.width_entry = tkinter.Entry(self.main_window)
        self.width_entry.pack()

        # 创建计算按钮
        self.calculate_button = tkinter.Button(self.main_window, text='计算面积', command=self.calculate_area)
        self.calculate_button.pack()

        # 创建用于显示结果的Label小部件
        self.result_label = tkinter.Label(self.main_window, text="")
        self.result_label.pack()

        tkinter.mainloop()

    def calculate_area(self):
        try:
            length = float(self.length_entry.get())
            width = float(self.width_entry.get())
            area = length * width
            self.result_label.config(text=f"矩形的面积是: {area}")
        except ValueError:
            self.result_label.config(text="输入无效,请输入数字。")

# 创建MyGUI类的实例
my_gui = MyGUI()

在这个程序中,创建了两个 Entry 小部件用于用户输入矩形的长度和宽度。当用户点击“计算面积”按钮时,会调用 calculate_area 方法。在该方法中,首先尝试将用户输入的内容转换为浮点数,然后计算矩形的面积,并将结果显示在 result_label 中。如果用户输入的不是有效的数字,会显示错误信息。

8. 单选按钮和复选按钮
  • 单选按钮(Radiobutton) :用于让用户从多个选项中选择一个。以下是一个示例程序,展示了如何使用单选按钮:
import tkinter

class MyGUI:
    def __init__(self):
        self.main_window = tkinter.Tk()

        # 创建一个IntVar对象来存储单选按钮的选择
        self.choice = tkinter.IntVar()

        # 创建三个单选按钮
        self.radio1 = tkinter.Radiobutton(self.main_window, text='选项1', variable=self.choice, value=1)
        self.radio2 = tkinter.Radiobutton(self.main_window, text='选项2', variable=self.choice, value=2)
        self.radio3 = tkinter.Radiobutton(self.main_window, text='选项3', variable=self.choice, value=3)

        # 布局单选按钮
        self.radio1.pack()
        self.radio2.pack()
        self.radio3.pack()

        # 创建一个按钮,点击时显示选择的选项
        self.show_button = tkinter.Button(self.main_window, text='显示选择', command=self.show_choice)
        self.show_button.pack()

        tkinter.mainloop()

    def show_choice(self):
        selected = self.choice.get()
        print(f"你选择了选项: {selected}")

# 创建MyGUI类的实例
my_gui = MyGUI()

在这个程序中,创建了一个 IntVar 对象 choice 来存储用户选择的选项。每个单选按钮都关联到这个 IntVar 对象,并设置了不同的 value 。当用户点击“显示选择”按钮时,会调用 show_choice 方法,该方法通过 choice.get() 获取用户选择的选项并打印输出。
- 复选按钮(Checkbutton) :用于让用户选择多个选项。以下是一个示例程序,展示了如何使用复选按钮:

import tkinter

class MyGUI:
    def __init__(self):
        self.main_window = tkinter.Tk()

        # 创建两个BooleanVar对象来存储复选按钮的状态
        self.var1 = tkinter.BooleanVar()
        self.var2 = tkinter.BooleanVar()

        # 创建两个复选按钮
        self.check1 = tkinter.Checkbutton(self.main_window, text='选项1', variable=self.var1)
        self.check2 = tkinter.Checkbutton(self.main_window, text='选项2', variable=self.var2)

        # 布局复选按钮
        self.check1.pack()
        self.check2.pack()

        # 创建一个按钮,点击时显示选择的选项
        self.show_button = tkinter.Button(self.main_window, text='显示选择', command=self.show_choices)
        self.show_button.pack()

        tkinter.mainloop()

    def show_choices(self):
        choice1 = self.var1.get()
        choice2 = self.var2.get()
        print(f"选项1是否选中: {choice1}, 选项2是否选中: {choice2}")

# 创建MyGUI类的实例
my_gui = MyGUI()

在这个程序中,创建了两个 BooleanVar 对象 var1 var2 来存储复选按钮的状态。每个复选按钮都关联到一个 BooleanVar 对象。当用户点击“显示选择”按钮时,会调用 show_choices 方法,该方法通过 var.get() 获取每个复选按钮的状态并打印输出。

8. 使用Canvas绘制图形

Canvas 小部件可以用于在窗口中绘制各种图形,如直线、矩形、椭圆等。以下是一个示例程序,展示了如何使用 Canvas 绘制一个矩形和一个椭圆:

import tkinter

class MyGUI:
    def __init__(self):
        self.main_window = tkinter.Tk()

        # 创建一个Canvas小部件
        self.canvas = tkinter.Canvas(self.main_window, width=300, height=200)
        self.canvas.pack()

        # 绘制一个矩形
        self.canvas.create_rectangle(50, 50, 200, 150, fill="blue")

        # 绘制一个椭圆
        self.canvas.create_oval(100, 100, 250, 150, fill="red")

        tkinter.mainloop()

# 创建MyGUI类的实例
my_gui = MyGUI()

在这个程序中,首先创建了一个 Canvas 小部件,并设置了其宽度和高度。然后使用 create_rectangle 方法绘制了一个蓝色的矩形,使用 create_oval 方法绘制了一个红色的椭圆。

9. 总结

通过前面的内容,我们全面学习了Python中使用 tkinter 模块进行GUI编程的基础知识,包括:
- 图形用户界面(GUI)的概念和特点,以及与命令行界面的区别。
- tkinter 模块的使用,包括创建主窗口、各种小部件(如 Button Label Entry 等)。
- 小部件的布局管理,如使用 pack 方法进行简单布局。
- 事件驱动编程,通过按钮点击等事件触发相应的操作。
- 获取用户输入和显示输出的方法。
- 单选按钮和复选按钮的使用,用于用户选择。
- 使用 Canvas 绘制图形。

以下是一个总结表格,展示了不同小部件的功能和使用场景:
| 小部件 | 功能 | 使用场景 |
| — | — | — |
| Button | 触发操作 | 执行计算、显示信息等 |
| Label | 显示文本或图像 | 显示提示信息、结果等 |
| Entry | 获取单行文本输入 | 让用户输入姓名、数字等 |
| Frame | 组织其他小部件 | 分组管理小部件 |
| Canvas | 绘制图形 | 创建绘图程序、游戏界面等 |
| Radiobutton | 单选选择 | 从多个选项中选择一个 |
| Checkbutton | 多选选择 | 选择多个选项 |

下面用mermaid流程图展示一个完整的GUI程序的主要流程:

graph TD;
    A[导入tkinter模块] --> B[创建主窗口];
    B --> C[创建小部件];
    C --> D[布局小部件];
    D --> E[绑定事件处理函数];
    E --> F[进入主循环];
    F --> G{等待事件};
    G --> H[处理事件];
    H --> G;

这个流程图展示了创建一个完整的GUI程序的主要步骤。首先导入 tkinter 模块,创建主窗口,然后创建各种小部件并进行布局。接着为小部件绑定事件处理函数,进入主循环等待用户操作。当用户触发事件时,程序会处理该事件,然后继续等待下一个事件。

掌握这些基础知识后,你可以进一步开发更复杂的GUI应用程序,如文件管理工具、图形编辑器等。不断实践和探索,你将能够熟练运用 tkinter 模块进行GUI编程。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值