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程序。在实际应用中,我们可以根据具体需求灵活运用这些小部件,不断提升程序的用户体验。
超级会员免费看
21

被折叠的 条评论
为什么被折叠?



