40、Python GUI编程:Entry、Label、Radio和Check按钮的使用

Python GUI编程:Entry、Label、Radio和Check按钮的使用

1. 使用Entry小部件获取输入

Entry小部件是一个矩形区域,用户可以在其中输入文本。在GUI程序中,通常会有一个或多个Entry小部件,以及一个按钮,用户点击该按钮来提交输入的数据。按钮的回调函数会从Entry小部件中检索数据并进行处理。

1.1 获取Entry小部件中的数据

使用Entry小部件的 get 方法可以检索用户输入的数据。该方法返回一个字符串,如果Entry小部件用于数字输入,则需要将其转换为适当的数据类型。

1.2 示例:公里到英里的转换

以下是一个示例程序,允许用户在Entry小部件中输入公里数,然后点击按钮将其转换为英里数:

import tkinter
import tkinter.messagebox

class KiloConverterGUI:
    def __init__(self):
        # 创建主窗口
        self.main_window = tkinter.Tk()

        # 创建两个框架来分组小部件
        self.top_frame = tkinter.Frame(self.main_window)
        self.bottom_frame = tkinter.Frame(self.main_window)

        # 创建顶部框架的小部件
        self.prompt_label = tkinter.Label(self.top_frame, text='Enter a distance in kilometers:')
        self.kilo_entry = tkinter.Entry(self.top_frame, width=10)

        # 打包顶部框架的小部件
        self.prompt_label.pack(side='left')
        self.kilo_entry.pack(side='left')

        # 创建底部框架的按钮小部件
        self.calc_button = tkinter.Button(self.bottom_frame, text='Convert', command=self.convert)
        self.quit_button = tkinter.Button(self.bottom_frame, text='Quit', command=self.main_window.destroy)

        # 打包按钮
        self.calc_button.pack(side='left')
        self.quit_button.pack(side='left')

        # 打包框架
        self.top_frame.pack()
        self.bottom_frame.pack()

        # 进入tkinter主循环
        tkinter.mainloop()

    # 转换方法,是计算按钮的回调函数
    def convert(self):
        # 获取用户在kilo_entry小部件中输入的值
        kilo = float(self.kilo_entry.get())

        # 将公里转换为英里
        miles = kilo * 0.6214

        # 在信息对话框中显示结果
        tkinter.messagebox.showinfo('Results', str(kilo) + ' kilometers is equal to ' + str(miles) + ' miles.')

# 创建KiloConverterGUI类的实例
kilo_conv = KiloConverterGUI()

1.3 代码解释

  • 创建主窗口和框架 :使用 tkinter.Tk() 创建主窗口,并创建两个框架 top_frame bottom_frame 来组织小部件。
  • 创建小部件 :在顶部框架中创建一个标签和一个Entry小部件,用于提示用户输入公里数。在底部框架中创建一个转换按钮和一个退出按钮。
  • 打包小部件 :使用 pack() 方法将小部件按照指定的方向排列。
  • 转换方法 convert() 方法是转换按钮的回调函数,它从Entry小部件中获取用户输入的值,将其转换为英里数,并在信息对话框中显示结果。

2. 使用标签作为输出字段

如果不想为程序的输出显示单独的对话框,可以使用主窗口中的标签小部件来动态显示输出。可以创建空的标签小部件,然后编写代码在按钮被点击时在这些标签中显示所需的数据。

2.1 StringVar对象的使用

tkinter 模块提供了一个名为 StringVar 的类,可以与标签小部件一起使用来显示数据。首先,创建一个 StringVar 对象,然后创建一个标签小部件并将其与 StringVar 对象关联。从那时起,存储在 StringVar 对象中的任何值都会自动显示在标签小部件中。

2.2 示例:公里到英里的转换(使用标签显示结果)

以下是一个修改后的公里到英里转换程序,它使用标签在主窗口中显示英里数:

import tkinter

class KiloConverterGUI:
    def __init__(self):
        # 创建主窗口
        self.main_window = tkinter.Tk()

        # 创建三个框架来分组小部件
        self.top_frame = tkinter.Frame()
        self.mid_frame = tkinter.Frame()
        self.bottom_frame = tkinter.Frame()

        # 创建顶部框架的小部件
        self.prompt_label = tkinter.Label(self.top_frame, text='Enter a distance in kilometers:')
        self.kilo_entry = tkinter.Entry(self.top_frame, width=10)

        # 打包顶部框架的小部件
        self.prompt_label.pack(side='left')
        self.kilo_entry.pack(side='left')

        # 创建中间框架的小部件
        self.descr_label = tkinter.Label(self.mid_frame, text='Converted to miles:')

        # 创建一个StringVar对象来关联输出标签
        self.value = tkinter.StringVar()

        # 创建一个标签并将其与StringVar对象关联
        self.miles_label = tkinter.Label(self.mid_frame, textvariable=self.value)

        # 打包中间框架的小部件
        self.descr_label.pack(side='left')
        self.miles_label.pack(side='left')

        # 创建底部框架的按钮小部件
        self.calc_button = tkinter.Button(self.bottom_frame, text='Convert', command=self.convert)
        self.quit_button = tkinter.Button(self.bottom_frame, text='Quit', command=self.main_window.destroy)

        # 打包按钮
        self.calc_button.pack(side='left')
        self.quit_button.pack(side='left')

        # 打包框架
        self.top_frame.pack()
        self.mid_frame.pack()
        self.bottom_frame.pack()

        # 进入tkinter主循环
        tkinter.mainloop()

    # 转换方法,是计算按钮的回调函数
    def convert(self):
        # 获取用户在kilo_entry小部件中输入的值
        kilo = float(self.kilo_entry.get())

        # 将公里转换为英里
        miles = kilo * 0.6214

        # 将英里转换为字符串并存储在StringVar对象中
        self.value.set(miles)

# 创建KiloConverterGUI类的实例
kilo_conv = KiloConverterGUI()

2.3 代码解释

  • 创建主窗口和框架 :使用 tkinter.Tk() 创建主窗口,并创建三个框架 top_frame mid_frame bottom_frame 来组织小部件。
  • 创建小部件 :在顶部框架中创建一个标签和一个Entry小部件,用于提示用户输入公里数。在中间框架中创建一个描述标签和一个用于显示英里数的标签。在底部框架中创建一个转换按钮和一个退出按钮。
  • 关联StringVar对象 :创建一个 StringVar 对象 self.value ,并将其与 miles_label 标签关联。
  • 转换方法 convert() 方法是转换按钮的回调函数,它从Entry小部件中获取用户输入的值,将其转换为英里数,并将英里数存储在 StringVar 对象中,从而更新 miles_label 标签的显示。

3. 创建一个计算平均分的GUI程序

假设要设计一个GUI程序,让学生输入三个测试成绩,然后点击按钮计算并显示平均分。

3.1 设计思路

首先,绘制程序窗口的草图,确定所需的小部件及其布局。然后,根据草图创建相应的小部件,并编写代码实现计算平均分的功能。

3.2 所需小部件列表

小部件编号 小部件类型 描述 名称
1 标签 指示用户输入测试1的成绩 test1_label
2 标签 指示用户输入测试2的成绩 test2_label
3 标签 指示用户输入测试3的成绩 test3_label
4 标签 标识平均分,平均分将显示在该标签旁边 result_label
5 Entry 用户输入测试1的成绩 test1_entry
6 Entry 用户输入测试2的成绩 test2_entry
7 Entry 用户输入测试3的成绩 test3_entry
8 标签 程序将显示平均测试成绩的标签 avg_label
9 按钮 点击该按钮,程序将计算平均测试成绩并显示在平均分标签中 calc_button
10 按钮 点击该按钮,程序将结束 quit_button

3.3 示例代码

import tkinter

class TestAvg:
    def __init__(self):
        # 创建主窗口
        self.main_window = tkinter.Tk()

        # 创建五个框架
        self.test1_frame = tkinter.Frame(self.main_window)
        self.test2_frame = tkinter.Frame(self.main_window)
        self.test3_frame = tkinter.Frame(self.main_window)
        self.avg_frame = tkinter.Frame(self.main_window)
        self.button_frame = tkinter.Frame(self.main_window)

        # 创建并打包测试1的小部件
        self.test1_label = tkinter.Label(self.test1_frame, text='Enter the score for test 1:')
        self.test1_entry = tkinter.Entry(self.test1_frame, width=10)
        self.test1_label.pack(side='left')
        self.test1_entry.pack(side='left')

        # 创建并打包测试2的小部件
        self.test2_label = tkinter.Label(self.test2_frame, text='Enter the score for test 2:')
        self.test2_entry = tkinter.Entry(self.test2_frame, width=10)
        self.test2_label.pack(side='left')
        self.test2_entry.pack(side='left')

        # 创建并打包测试3的小部件
        self.test3_label = tkinter.Label(self.test3_frame, text='Enter the score for test 3:')
        self.test3_entry = tkinter.Entry(self.test3_frame, width=10)
        self.test3_label.pack(side='left')
        self.test3_entry.pack(side='left')

        # 创建并打包平均分的小部件
        self.result_label = tkinter.Label(self.avg_frame, text='Average:')
        self.avg = tkinter.StringVar()  # 用于更新avg_label
        self.avg_label = tkinter.Label(self.avg_frame, textvariable=self.avg)
        self.result_label.pack(side='left')
        self.avg_label.pack(side='left')

        # 创建并打包按钮小部件
        self.calc_button = tkinter.Button(self.button_frame, text='Average', command=self.calc_avg)
        self.quit_button = tkinter.Button(self.button_frame, text='Quit', command=self.main_window.destroy)
        self.calc_button.pack(side='left')
        self.quit_button.pack(side='left')

        # 打包框架
        self.test1_frame.pack()
        self.test2_frame.pack()
        self.test3_frame.pack()
        self.avg_frame.pack()
        self.button_frame.pack()

        # 启动主循环
        tkinter.mainloop()

    # calc_avg方法是calc_button小部件的回调函数
    def calc_avg(self):
        # 获取三个测试成绩并存储在变量中
        self.test1 = float(self.test1_entry.get())
        self.test2 = float(self.test2_entry.get())
        self.test3 = float(self.test3_entry.get())

        # 计算平均分
        self.average = (self.test1 + self.test2 + self.test3) / 3.0

        # 通过将self.average的值存储在avg引用的StringVar对象中来更新avg_label小部件
        self.avg.set(self.average)

# 创建TestAvg类的实例
test_avg = TestAvg()

3.4 代码解释

  • 创建主窗口和框架 :使用 tkinter.Tk() 创建主窗口,并创建五个框架来组织小部件。
  • 创建小部件 :为每个测试成绩创建一个标签和一个Entry小部件,为平均分创建一个标签和一个用于显示平均分的标签,以及一个计算按钮和一个退出按钮。
  • 计算平均分 calc_avg() 方法是计算按钮的回调函数,它从三个Entry小部件中获取用户输入的成绩,计算平均分,并将平均分存储在 StringVar 对象中,从而更新 avg_label 标签的显示。

4. 单选按钮和复选按钮

4.1 单选按钮

单选按钮通常以两个或更多的组形式出现,允许用户从多个可能的选项中选择一个。使用 tkinter 模块的 Radiobutton 类来创建单选按钮小部件。同一容器(如框架)中的单选按钮是互斥的,即同一时间只能选择一个。

4.1.1 IntVar对象的使用

tkinter 模块提供了一个名为 IntVar 的类,可以与单选按钮小部件一起使用。创建一组单选按钮时,将它们都与同一个 IntVar 对象关联,并为每个单选按钮分配一个唯一的整数值。当选择一个单选按钮时,它会将其唯一的整数值存储在 IntVar 对象中。

4.1.2 示例代码
import tkinter
import tkinter.messagebox

class MyGUI:
    def __init__(self):
        # 创建主窗口
        self.main_window = tkinter.Tk()

        # 创建两个框架
        self.top_frame = tkinter.Frame(self.main_window)
        self.bottom_frame = tkinter.Frame(self.main_window)

        # 创建一个IntVar对象用于单选按钮
        self.radio_var = tkinter.IntVar()

        # 将IntVar对象设置为1
        self.radio_var.set(1)

        # 在顶部框架中创建单选按钮小部件
        self.rb1 = tkinter.Radiobutton(self.top_frame, text='Option 1', variable=self.radio_var, value=1)
        self.rb2 = tkinter.Radiobutton(self.top_frame, text='Option 2', variable=self.radio_var, value=2)
        self.rb3 = tkinter.Radiobutton(self.top_frame, text='Option 3', variable=self.radio_var, value=3)

        # 打包单选按钮
        self.rb1.pack()
        self.rb2.pack()
        self.rb3.pack()

        # 创建一个OK按钮和一个退出按钮
        self.ok_button = tkinter.Button(self.bottom_frame, text='OK', command=self.show_choice)
        self.quit_button = tkinter.Button(self.bottom_frame, text='Quit', command=self.main_window.destroy)

        # 打包按钮
        self.ok_button.pack(side='left')
        self.quit_button.pack(side='left')

        # 打包框架
        self.top_frame.pack()
        self.bottom_frame.pack()

        # 启动主循环
        tkinter.mainloop()

    # show_choice方法是OK按钮的回调函数
    def show_choice(self):
        tkinter.messagebox.showinfo('Selection', 'You selected option ' + str(self.radio_var.get()))

# 创建MyGUI类的实例
my_gui = MyGUI()
4.1.3 代码解释
  • 创建主窗口和框架 :使用 tkinter.Tk() 创建主窗口,并创建两个框架来组织小部件。
  • 创建IntVar对象 :创建一个 IntVar 对象 self.radio_var ,并将其初始值设置为1。
  • 创建单选按钮 :在顶部框架中创建三个单选按钮,将它们都与 self.radio_var 对象关联,并分别为它们分配值1、2和3。
  • 显示选择结果 show_choice() 方法是OK按钮的回调函数,它从 self.radio_var 对象中获取所选单选按钮的值,并在信息对话框中显示该值。

4.2 复选按钮

复选按钮可以单独出现或成组出现,允许用户进行是/否或开/关的选择。使用 tkinter 模块的 Checkbutton 类来创建复选按钮小部件。与单选按钮不同,复选按钮不是互斥的,用户可以选择任意数量的复选按钮。

4.2.1 IntVar对象的使用

同样可以使用 IntVar 对象与复选按钮小部件一起使用,但每个复选按钮需要关联一个不同的 IntVar 对象。当复选按钮被选中时,其关联的 IntVar 对象将持有值1;当复选按钮未被选中时,其关联的 IntVar 对象将持有值0。

4.2.2 示例代码
import tkinter
import tkinter.messagebox

class MyGUI:
    def __init__(self):
        # 创建主窗口
        self.main_window = tkinter.Tk()

        # 创建两个框架
        self.top_frame = tkinter.Frame(self.main_window)
        self.bottom_frame = tkinter.Frame(self.main_window)

        # 创建三个IntVar对象用于复选按钮
        self.cb_var1 = tkinter.IntVar()
        self.cb_var2 = tkinter.IntVar()
        self.cb_var3 = tkinter.IntVar()

        # 将IntVar对象设置为0
        self.cb_var1.set(0)
        self.cb_var2.set(0)
        self.cb_var3.set(0)

        # 在顶部框架中创建复选按钮小部件
        self.cb1 = tkinter.Checkbutton(self.top_frame, text='Option 1', variable=self.cb_var1)
        self.cb2 = tkinter.Checkbutton(self.top_frame, text='Option 2', variable=self.cb_var2)
        self.cb3 = tkinter.Checkbutton(self.top_frame, text='Option 3', variable=self.cb_var3)

        # 打包复选按钮
        self.cb1.pack()
        self.cb2.pack()
        self.cb3.pack()

        # 创建一个OK按钮和一个退出按钮
        self.ok_button = tkinter.Button(self.bottom_frame, text='OK', command=self.show_choice)
        self.quit_button = tkinter.Button(self.bottom_frame, text='Quit', command=self.main_window.destroy)

        # 打包按钮
        self.ok_button.pack(side='left')
        self.quit_button.pack(side='left')

        # 打包框架
        self.top_frame.pack()
        self.bottom_frame.pack()

        # 启动主循环
        tkinter.mainloop()

    # show_choice方法是OK按钮的回调函数
    def show_choice(self):
        # 创建一个消息字符串
        self.message = 'You selected:\n'

        # 确定哪些复选按钮被选中,并相应地构建消息字符串
        if self.cb_var1.get() == 1:
            self.message = self.message + '1\n'
        if self.cb_var2.get() == 1:
            self.message = self.message + '2\n'
        if self.cb_var3.get() == 1:
            self.message = self.message + '3\n'

        # 在信息对话框中显示消息
        tkinter.messagebox.showinfo('Selection', self.message)

# 创建MyGUI类的实例
my_gui = MyGUI()
4.2.3 代码解释
  • 创建主窗口和框架 :使用 tkinter.Tk() 创建主窗口,并创建两个框架来组织小部件。
  • 创建IntVar对象 :创建三个 IntVar 对象 self.cb_var1 self.cb_var2 self.cb_var3 ,并将它们的初始值都设置为0。
  • 创建复选按钮 :在顶部框架中创建三个复选按钮,分别将它们与 self.cb_var1 self.cb_var2 self.cb_var3 对象关联。
  • 显示选择结果 show_choice() 方法是OK按钮的回调函数,它检查每个 IntVar 对象的值,确定哪些复选按钮被选中,并在信息对话框中显示所选选项的列表。

4.3 单选按钮和复选按钮的对比

对比项 单选按钮 复选按钮
选择规则 同一组中只能选择一个选项 可以选择任意数量的选项
互斥性 具有互斥性 不具有互斥性
关联对象 一组单选按钮关联同一个 IntVar 对象 每个复选按钮关联一个不同的 IntVar 对象
使用场景 适用于从多个选项中选择一个的场景,如性别选择 适用于进行多项选择的场景,如兴趣爱好选择

4.4 使用回调函数与单选按钮

在前面的示例中,程序等待用户点击OK按钮才确定哪个单选按钮被选中。实际上,也可以为单选按钮指定回调函数,当单选按钮被选中时立即执行该函数。

4.4.1 示例代码
import tkinter
import tkinter.messagebox

class MyGUI:
    def __init__(self):
        # 创建主窗口
        self.main_window = tkinter.Tk()

        # 创建两个框架
        self.top_frame = tkinter.Frame(self.main_window)
        self.bottom_frame = tkinter.Frame(self.main_window)

        # 创建一个IntVar对象用于单选按钮
        self.radio_var = tkinter.IntVar()

        # 将IntVar对象设置为1
        self.radio_var.set(1)

        # 在顶部框架中创建单选按钮小部件,并指定回调函数
        self.rb1 = tkinter.Radiobutton(self.top_frame, text='Option 1', variable=self.radio_var, value=1, command=self.my_method)
        self.rb2 = tkinter.Radiobutton(self.top_frame, text='Option 2', variable=self.radio_var, value=2, command=self.my_method)
        self.rb3 = tkinter.Radiobutton(self.top_frame, text='Option 3', variable=self.radio_var, value=3, command=self.my_method)

        # 打包单选按钮
        self.rb1.pack()
        self.rb2.pack()
        self.rb3.pack()

        # 创建一个退出按钮
        self.quit_button = tkinter.Button(self.bottom_frame, text='Quit', command=self.main_window.destroy)

        # 打包按钮
        self.quit_button.pack()

        # 打包框架
        self.top_frame.pack()
        self.bottom_frame.pack()

        # 启动主循环
        tkinter.mainloop()

    # 回调函数
    def my_method(self):
        tkinter.messagebox.showinfo('Selection', 'You selected option ' + str(self.radio_var.get()))

# 创建MyGUI类的实例
my_gui = MyGUI()
4.4.2 代码解释
  • 创建主窗口和框架 :与前面的示例相同,使用 tkinter.Tk() 创建主窗口,并创建两个框架来组织小部件。
  • 创建单选按钮并指定回调函数 :在创建单选按钮时,使用 command 参数指定回调函数 self.my_method 。当单选按钮被选中时,会立即调用该函数。
  • 回调函数 my_method() 函数从 self.radio_var 对象中获取所选单选按钮的值,并在信息对话框中显示该值。

5. 总结

5.1 关键知识点回顾

  • Entry小部件 :用于获取用户输入,使用 get 方法检索数据,若用于数字输入需进行类型转换。
  • 标签作为输出字段 :通过 StringVar 对象与标签关联,可动态显示输出。
  • 单选按钮 :同一组中只能选择一个选项,使用 IntVar 对象确定所选选项。
  • 复选按钮 :可选择任意数量的选项,每个复选按钮关联一个不同的 IntVar 对象。

5.2 实际应用建议

  • 在设计GUI程序时,应根据需求合理选择小部件。如果需要用户从多个选项中选择一个,可使用单选按钮;如果需要用户进行多项选择,可使用复选按钮。
  • 对于用户输入的数据,要进行必要的验证和类型转换,以避免程序出现错误。
  • 合理使用框架来组织小部件,使界面布局更加清晰。

5.3 未来拓展方向

  • 可以进一步学习 tkinter 模块的其他功能,如菜单、滚动条等,以创建更复杂的GUI程序。
  • 结合数据库,实现数据的存储和管理,使程序具有更强大的功能。
  • 尝试使用其他GUI库,如 PyQt wxPython 等,比较不同库的优缺点。

5.4 流程图总结

graph TD;
    A[开始] --> B[创建主窗口];
    B --> C{选择小部件类型};
    C -->|Entry小部件| D[获取用户输入];
    C -->|标签输出| E[关联StringVar对象并显示输出];
    C -->|单选按钮| F[关联IntVar对象并选择选项];
    C -->|复选按钮| G[关联IntVar对象并选择多项];
    D --> H[处理输入数据];
    E --> H;
    F --> H;
    G --> H;
    H --> I[显示结果];
    I --> J[结束];

通过以上内容的学习,我们掌握了Python中 tkinter 模块的一些常见小部件的使用方法,包括Entry小部件、标签、单选按钮和复选按钮。这些小部件可以帮助我们创建出功能丰富、交互性强的GUI程序。在实际应用中,我们可以根据具体需求灵活运用这些小部件,不断提升程序的用户体验。

内容概要:本文详细介绍了“秒杀商城”微服务架构的设计与实战全过程,涵盖系统从需求分析、服务拆分、技术选型到核心功能开发、分布式事务处理、容器化部署及监控链路追踪的完整流程。重点解决了高并发场景下的超卖问题,采用Redis预减库存、消息队列削峰、数据库乐观锁等手段保障数据一致性,并通过Nacos实现服务注册发现与配置管理,利用Seata处理跨服务分布式事务,结合RabbitMQ实现异步下单,提升系统吞吐能力。同时,项目支持Docker Compose快速部署Kubernetes生产级编排,集成Sleuth+Zipkin链路追踪与Prometheus+Grafana监控体系,构建可观测性强的微服务系统。; 适合人群:具备Java基础Spring Boot开发经验,熟悉微服务基本概念的中高级研发人员,尤其是希望深入理解高并发系统设计、分布式事务、服务治理等核心技术的开发者;适合工作2-5年、有志于转型微服务或提升架构能力的工程师; 使用场景及目标:①学习如何基于Spring Cloud Alibaba构建完整的微服务项目;②掌握秒杀场景下高并发、超卖控制、异步化、削峰填谷等关键技术方案;③实践分布式事务(Seata)、服务熔断降级、链路追踪、统一配置中心等企业级中间件的应用;④完成从本地开发到容器化部署的全流程落地; 阅读建议:建议按照文档提供的七个阶段循序渐进地动手实践,重点关注秒杀流程设计、服务间通信机制、分布式事务实现系统性能优化部分,结合代码调试与监控工具深入理解各组件协作原理,真正掌握高并发微服务系统的构建能力。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值