第066讲: GUI的终极选择:Tkinter3 | 学习记录(小甲鱼零基础入门学习Python)

版权声明:转载请标明出处: https://blog.csdn.net/qq_38970783/article/details/88802582

今天我们一起来学习三个组件:CheckbuttonRadiobuttonLabelFrame

同样,我们还是通过案例来讲解。

一、Checkbutton

Checkbutton(多选框)。大家都知道什么叫做“翻牌子”,今天的第一个例子就是来写一个翻牌子的程序。

Checkbutton 就是我们常见的多选框按钮,而 下面要讲的 Radiobutton 就是单选框按钮。那大家觉得 翻牌子 程序应该是使用 Checkbutton 还是 Radiobutton 来实现呢?应该是 Checkbutton 。

我们首先来测试一下 Checkbutton ,来感受一下 它的用法:

import tkinter as tk
 
root = tk.Tk()
 
v = tk.IntVar() #设置一个tk 变量用于表示按钮是否被选中,这里用整型变量 IntVar
 
c = tk.Checkbutton(root, text= "测试一下", variable = v)
c.pack()
 
root.mainloop()

运行结果如下:

没有按按钮时: ->         点下按钮的时候:->  

当我们点下按钮的时候,这个框框里会出现一个小勾,为了更直观的让大家知道选中和未选中时 v 的表现状态,我们可以把它显示出来,显示在 Label 标签里面。

import tkinter as tk
 
root = tk.Tk()
 
v = tk.IntVar() #设置一个tk 变量用于表示按钮是否被选中,这里用整型变量 IntVar
 
c = tk.Checkbutton(root, text= "测试一下", variable = v[-1])
c.pack()
 
l = tk.Label(root, textvariable = v)
l.pack()
 
root.mainloop()

运行结果如下:

没有选中时: ->         选中的时候:->  

有了这样的基础,我们就可以来写我们的翻牌子程序了。

import tkinter as tk
 
root = tk.Tk()

beauties = ['西   施','貂   蝉','杨玉环','王昭君',]

v = []

for beauty in beauties :
    v.append(tk.IntVar())
    c = tk.Checkbutton(root, text= beauty, variable = v[-1])
    c.pack()

 
root.mainloop()

运行结果如下:

我们希望把所有的 **Checkbotton 左对齐**:

通过设置 pack 的 anchor 选项,就可以实现了。 anchor 选项用于制定显示位置 的。

anchor 用法:

  1. 控制文本(或图像)在 Button 中显示的位置

  2. "n" , “ne”, “e”, “se”, “s”, “sw”, “w”, “nw”, 或者 “center” 来定位(ewsn 代表东西南北,上北下南左西右东)

  3. 默认值 是 “center”

b.pack(anchor = "w")
  
  

二、Radiobutton

Radiobutton(单选框),Radiobutton 的用法和 Checkbutton 的用法基本一致,唯一不同的就是 Radiobutton 要实现单选的效果,就是需要同一组内所有的 Radiobutton 只能共享一个 variable 选项,并且需要设置不同的 value 选项的值

我们通过代码来讲解:

import tkinter as tk
 
root = tk.Tk()

v = tk.IntVar()

c = tk.Radiobutton(root, text= 'one', variable = v,value=1)
c.pack(anchor = 'w')  #anchor用于决定方位
c = tk.Radiobutton(root, text= 'two', variable = v,value=2)
c.pack(anchor = 'w')  #anchor用于决定方位
c = tk.Radiobutton(root, text= 'three', variable = v,value=3)
c.pack(anchor = 'w')  #anchor用于决定方位


root.mainloop()

运行结果如下:

这里有两点需要注意的:

1、variable 选项只能设置为同一个变量,这里都是 v;

2、value 选项的值 一定要不同,才能实现互测。

Radiobutton 的原理就是:你每一次点中一个按钮,它就会把这个按钮的 value 给 v,然后根据 v 的值来选中对应的框。

同样的,如果你有多个选项的话,我们仍然可以使用循环,使得代码更加简洁:

import tkinter as tk
 
root = tk.Tk()

languages = [('Python',1),('Perl',2),('Ruby',3),('Lua',4),('C++',5)]

v = tk.IntVar()
v.set(1) #一开始直接选中第一个

for language in languages :
    c = tk.Radiobutton(root,text=language[0],variable=v,value=language[1])
    c.pack(anchor = 'w')

root.mainloop()

运行结果如下:

有人要提意见了:“我不喜欢前面的小圆圈,我有圆形恐惧症!”

没问题,我们只需要加一个选项 indicatoron = False。(indicatoron 就是指示器,就是前面的小圆圈,把它设置为 False,就不会显示了。

import tkinter as tk
 
root = tk.Tk()

languages = [('Python',1),('Perl',2),('Ruby',3),('Lua',4),('C++',5)]

v = tk.IntVar()
v.set(1) #一开始直接选中第一个

for language in languages :
    c = tk.Radiobutton(root,text=language[0],variable=v,value=language[1],indicatoron = False)
    c.pack(anchor = 'w')

root.mainloop()

如下:

这样不美观,我们可以**横向填充按钮**。

import tkinter as tk
 
root = tk.Tk()

languages = [('Python',1),('Perl',2),('Ruby',3),('Lua',4),('C++',5)]

v = tk.IntVar()
v.set(1) #一开始直接选中第一个

# anchor = 'w' 对齐方向
# indicatoron = False 取消显示小圆圈
# fill = 'x' 填满整个x轴 (横向填充)

for language in languages :
    c = tk.Radiobutton(root,text=language[0],variable=v,value=language[1],indicatoron = False)
    c.pack(anchor = 'w',fill = 'x')

root.mainloop()

三、LabelFrame

LabelFrame(标签框架),这实际上是 Frame 框架的进化版,从形态上来说,也就是添加了 LabelFrame,但是有了它,CheckbuttonRadiobutton 的分组就变得简单了。

import tkinter as tk
 
root = tk.Tk()

labelframe =tk.LabelFrame(root, text = "最好的脚本语言是:", padx = 5, pady =5)
labelframe.pack(padx=10,pady=10)


languages = [('Python',1),('Perl',2),('Ruby',3),('Lua',4),('C++',5)]

v = tk.IntVar()
v.set(1) #一开始直接选中第一个

# anchor = 'w' 对齐方向
# indicatoron = False 取消显示小圆圈
# fill = 'x' 填满整个x轴 (横向填充)

for language in languages :
    c = tk.Radiobutton(labelframe,text=language[0],variable=v,value=language[1],indicatoron = False)
    c.pack(anchor = 'w',fill = 'x')

root.mainloop()

运行结果如下:

猜你喜欢

转载自blog.csdn.net/qq_38970783/article/details/88802582
今日推荐