前言
Button是tkinter中的按钮控件,是用这个按钮可以实现程序与用户的交互,用户如果点击按钮,程序会执行相应规定好的事件函数, 事件函数可以为开发人员自定义的函数。
Button使用起来很简单,它可以包含文本、图像、位图,感觉是一个可以点击的Label,就是多了一个command
参数设置,通过该设置可以规定对应按钮的事件函数。
先来一段代码:
from tkinter import *
from tkinter import messagebox # Button经常会和messagebox控件一起使用
def alert(): # 定义事件函数
messagebox.showinfo(title='hello', message='Hello world') #弹出消息框,标题为hello,消息为Hello world
root = Tk()
root.title('点击按钮会有弹窗')
Button(root, text='点我', command=alert).pack(side='bottom') # 定义一个Button控件,并把它放入窗口底部
mainloop()
可以看到点击后立刻触发了事件函数,调用了messagebox控件的showinfo函数,弹出了消息为Hello world的提示窗
Button定义方式:
bt=Button(master,option,……)
和Label控件一样, 其中master为父容器,option为可以设置的属性
我们看一下Button控件有哪些可以设置的属性
print(bt.keys())
结果如下:
['activebackground', 'activeforeground', 'anchor', 'background', 'bd', 'bg', 'bitmap', 'borderwidth', 'command', 'compound', 'cursor', 'default', 'disabledforeground', 'fg', 'font', 'foreground', 'height', 'highlightbackground', 'highlightcolor', 'highlightthickness', 'image', 'justify', 'overrelief', 'padx', 'pady', 'relief', 'repeatdelay', 'repeatinterval', 'state', 'takefocus', 'text', 'textvariable', 'underline', 'width', 'wraplength']
可以发现大部分参数与Label还是没有太大差别的
常用的属性与其意义如下:
属性 | 意义 |
---|---|
anchor | 控制文本所在的位置,默认为中心位置(CENTER) |
activebackground | 当鼠标放在按钮上时候,按妞的背景颜色 |
activeforeground | 当鼠标放在按钮上时候,按钮的前景色 |
bd | 钮边框的大小,默认为 2 个像素 |
bg | 按钮的背景色 |
fg | 按钮的前景色 |
font | 按钮文本的字体样样式 |
height | 按钮的高度 |
highlightcolor | 按钮控件高亮处要显示的颜色 |
image | 按钮上要显示的图片 |
justify | 按钮显示多行文本时,用来指定文本的对齐方式,参数值有 LEFT/RIGHT/CENTER |
padx/pady | padx 指定 x 轴(水平方向)的间距大小,pady 则表示 y轴(垂直方向)的间距大小 |
ipadx/ipady | ipadx 指标签文字与标签容器之间的横向距离;ipady 则表示标签文字与标签容器之间的纵向距离 |
state | 设置按钮的可用状态,可选参数有NORMAL/ACTIVE/DISABLED,默认为 NORMAL |
text | 按钮控件要显示的文本 |
我们打印看一下Button比Label多了那些设置
from tkinter import *
lb = Label()
bt = Button()
lb_set = set(lb.keys())
bt_set = set(bt.keys())
print(bt_set.difference(lb_set))
结果:
{'default', 'command', 'repeatinterval', 'repeatdelay', 'overrelief'}
属性 | 意义 |
---|---|
default | 若设置此属性,则该按钮为默认按钮, 值可以为active, disabled, or normal |
command | 指定按钮被点击时调用的函数。 |
repeatinterval | 重复间隔,repeatinterval需要和repeatdelay一起使用才能凑效.作用就是长按按钮时,间隔repeatinterval(ms),执行相应动作. |
repeatdelay | 表示点击按钮后,延迟repeatdelay(ms),做出相应动作. |
overrelief | 当鼠标飘过按钮时,按钮的边框的显示样式 |
Button控件还有几种常用的方法
方法 | 描述 |
---|---|
deselect() | 清除单选按钮的状态 |
flash() | 在激活状态颜色和正常颜色之间闪烁几次单选按钮,但保持它开始时的状态。 |
invoke() | 可以调用此方法来获得与用户单击单选按钮以更改其状态时发生的操作相同的操作 |
select() | 设置单选按钮为选中。 |
focus() | 设置焦点 |
简单应用
1)
from tkinter import *
from tkinter import messagebox
def button_left():
messagebox.showwarning('wrong!', 'you have make some mistakes')
def button_right():
messagebox.showinfo('yes!', 'you are right!!')
root = Tk()
root.title('a button')
Label(root, text='猜猜哪个是对的?', bg='lightblue').grid(row=1, column=3)
Button(root, text='A', bg='#abe88d', command=button_left).grid(row=3, column=1)
Button(root, text='B', bg='#427ef6', command=button_right).grid(row=3, column=5)
mainloop()
效果如下:
点击A:
点击B:
2)
使用Button还可以使界面的控件产生变化
from tkinter import *
def change():
if lb['text'] == '注意这里!!': # 这里使用了if判断,目的就是为了点击按钮可以在两者之间来回切换
lb.config(text='我变了呀', bg='#bfe87d')
else:
lb.config(text='注意这里!!', bg='lightblue')
root = Tk()
root.geometry('400x400')
lb = Label(root, text='注意这里!!', bg='lightblue', font=('微软雅黑', 50, 'bold', 'italic'))
print(lb['text'])
lb.grid(row=1, column=1)
Button(root, text='点我试试看', padx=10, pady=10, command=change).grid(row=1, column=3)
mainloop()
点击前:
点击后:
3)
按钮中的内容可以为文本,也可以为图片,也可以图片和文字混合。
from tkinter import *
root = Tk()
root.geometry('400x400')
image = PhotoImage(file='./resources/button.png')
Button(root, image=image, compound=LEFT, text='点我退出窗口',
command=root.quit).pack() # command设置的事件函数为窗口的quit函数,可以实现用按钮关闭窗口的作用
mainloop()
点击按钮,触发窗口退出函数,会退出窗口。
4)
这里需要对command参数说明一下,command所配置的值是函数名,不能加括号,加了括号虽然有时不报错,但是这样窗体一运行对应的函数就会立刻执行。但是在一些场景中我们可能需要往事件函数中添加一些参数,这里就可以使用lambda匿名函数,具体如下:
from tkinter import *
def change_var(string):
global var
var.set(string)
root = Tk()
root.geometry('200x200')
var = StringVar()
var.set('')
Label(root, text="你选择的是").grid(row=1, column=1)
Label(root, textvariable=var, bg='lightblue').grid(row=1, column=2)
Button(root, text='A', command=lambda: change_var('A')).grid(row=2, column=2)
Button(root, text='B', command=lambda: change_var('B')).grid(row=2, column=3)
Button(root, text='C', command=lambda: change_var('C')).grid(row=2, column=4)
Button(root, text='D', command=lambda: change_var('D')).grid(row=2, column=5)
root.mainloop()
点击对应的按钮,标签lb2上就会出现对应的选项。
tkinter 中的变量
上一个例子中StringVar()是tkinter中特有的变量
在tkinter中,有些控件 (比如 Entry 控件, Label控件等) 可以通过传入特定参数直接和一个程序变量绑定, 这些参数包括: variable, textvariable, onvalue, offvalue, value。
这种绑定是双向的: 如果该变量发生改变, 与该变量绑定的控件也会随之更新。
这些 Tkinter 控制变量和一般的 Python 变量一样, 都是用来保存某个值的. 但一般的 Python 变量不能被传递给 variable 或者 textvariable 参数. 这些参数可接受的类型仅限于 Tkinter 包中的 Variable 类的子类. 如下:
Variable | 可以保存的变量 |
---|---|
StringVar() | 保存一个String类型的变量 |
IntVar() | 保存一个整型变量 |
DoubleVar() | 保存一个浮点型变量 |
BooleanVar() | 保存一个布尔型变量 |
对于这类tkinter包中定义的变量,有两个方法:
get()
:得到其保存的变量值set()
设置其要保存的值