文章目录
前言
这里我将继续承接上次写到的 第十一点 ‘文本框Text’
十二、组合框Combobox
Combobox实质上就是带文本框的下拉列表框,可以将python的列表类型数据可视化呈现,在实际应用中因为其灵活的界面,往往比列表框受欢迎。该控件并不直接包含在tkinter模块中,而是包含在tkinter的子模块中ttk里面,如果要使用需要单独导入(from tkinter.ttk import *) , 基本用法如下:
实例名称 = tk.Combobox(根窗口,属性(如:textvariable=,values=)
注意:在创建Combobox时需要先绑定tkinter内部类型变量
1、var=tk.StringVar() (如果导入tkinter模块的 * 这里可以省略 tk);
2、设置实例属性 textvariable=var、values=列表/元组..,
该控件除了共有属性还有get()获得选中值,current()获得选中项的索引值。
相关代码展示如下:
import tkinter as tk
from tkinter.ttk import *
def subtract():
#获取entry1的输入值
value1 = float(entry1.get())
# 获取entry2的输入值
value2 = float(entry2.get())
dic = {0:value1+value2,1:value1-value2,
2:value1*value2,3:value1/value2}
value3 = dic[combobox.current()] #current()方法获取索引值
#config()方法输出显示文本
label.config(text=value3)
root = tk.Tk()
root.title('Combobox控件')
root.geometry('480x260')
#声明变量类型
var = tk.StringVar()
#创建组合框
combobox = Combobox(root,textvariable=var,values=('加','减','乘','除'))
combobox.grid(column=1,row=2,ipady=3,pady=1)
#创建输入框
entry1 = tk.Entry(root)
entry1.grid(column=0,row=0,ipady=3)
entry2 = tk.Entry(root)
entry2.grid(column=5,row=0,ipady=3)
# #创建按钮
button = tk.Button(root,text='计算',command=subtract)
button.grid(column=1,row=3)
#Label标签
label = tk.Label(root,text='')
label.grid(column=1,row=4)
root.mainloop()
运行效果如图所示:
十三、滑块Scale
Scale 用于创建一个标尺滑动条对象,用户可以移动标尺上的光标来设置数值。主要有以下属性:
属性 | 功能描述 |
from | 起始值(最小可取值) |
label | 标签文字,默认为无 |
length | 控件实例宽(水平)或高(垂直方向),默认为100像素 |
orient | 控件呈现方向,VERTICAL或HORIZONTAL(默认) |
repeatdelay | 鼠标延时(默认为300ms) |
resolution | 分辨精度(即最小取值间隔) |
state | 状态,若设置state=DISABLED,则滑块控件实例不可用 |
sliderlength | 滑块宽度,默认为30像素 |
to | 终止值(最大可取值) |
tickinterval | 标尺间隔,默认为0,若设置过小,则会重叠 |
width | 控件实例的宽度,默认为15像素 |
variable | 返回数值类型,可为 IntVar(整数)、DoubleVar(浮点数) 或StringVar(字符串) |
Scale还有这两个常用方法:
(1) get() ( 取得目前标尺上的光标值 )。
(2) set(value) ( 设置目前标尺上的光标值 )。
下面以相关代码展示(绑定鼠标事件):
import tkinter as tk
#绑定鼠标事件需要传入参数event
def get_values(event):
text = '滑块取值:'+ str(scale.get())
label.config(text=text)
#根窗口
root = tk.Tk()
root.title('Scale控件')
#窗口初始大小
root.geometry('480x260')
#设置返回数值类型浮点型
var = tk.DoubleVar()
scale = tk.Scale(root,variable=var,label='拖动滑块选值',\
length=240,from_=1.0,to=10.0,orient='vertical',\
tickinterval=3.0,resolution=0.1)
#将滑块固定在4.0的位置
scale.set(4.0)
#释放鼠标左键ButtonRelease-1,调用函数get_values
scale.bind('<ButtonRelease-1>',get_values)
scale.pack()
#Label标签显示输出滑块值
label = tk.Label(root,text='')
label.place(x=250,y=100)
root.mainloop()
运行效果如图:
十四、菜单Menu
Mnue控件用于将一系列我们需要操作的命令,进行分组划分,从而更加方便用户进行操作。
主要用法如下:
较为常见的方法有:添加菜单分组 add_cascade()、添加菜单命令 add_coomand()、
添加分割线 add_separator(),如果需要去除菜单分组的默认虚线可以使用 tearoff=False命令。
相关代码展示:
import tkinter as tk
#根窗口
root = tk.Tk()
root.title('Menu控件')
root.geometry('380x240+600+350')
#主菜单(只能有一个)
main_menu = tk.Menu(root)
#分组菜单
file_menu = tk.Menu(main_menu,tearoff=False) #tearoff=False去除分组里的默认虚线
main_menu.add_cascade(label='文件',menu=file_menu)
file_menu.add_command(label='新建')
#子菜单
file_menu2 = tk.Menu(main_menu,tearoff=False)
edit_menu.add_cascade(label='打开',menu=file_menu2)
file_menu2.add_command(label='最近文件')
#分割线
file_menu.add_separator()
file_menu.add_command(label='退出')
edit_menu = tk.Menu(tearoff=False) #tearoff=False去除分组里的默认虚线
main_menu.add_cascade(label='编辑',menu=edit_menu)
edit_menu.add_command(label='剪切')
edit_menu.add_command(label='粘贴')
format_menu = tk.Menu(tearoff=False) #tearoff=False去除分组里的默认虚线
main_menu.add_cascade(label='格式',menu=format_menu)
format_menu.add_command(label='自动换行')
format_menu.add_command(label='字体')
see_menu = tk.Menu(tearoff=False)
main_menu.add_cascade(label='查看',menu=see_menu)
see_menu.add_command(label='缩放')
help_menu = tk.Menu(tearoff=False)
main_menu.add_cascade(label='帮助',menu=help_menu)
help_menu.add_command(label='查看帮助')
#显示菜单
root.config(menu=main_menu)
root.mainloop()
运行效果如图:
十五、子窗体Toplevel
Toplevel用于新建一个窗体于主窗体上(我们称为子窗体),可设置的属性基本于主窗体一致,也能实现在上面布局控件。相关代码展示如下:
import tkinter as tk
#创建一个窗口
root = tk.Tk()
root.title('主窗口')
#窗口初始化大小
root.geometry('320x240')
def newwindow():
root2 = tk.Toplevel(root)
root2.geometry('320x240')
root2.title('子窗口')
lb2 = tk.Label(root2,text='我在子窗体上面')
lb2.place(relx=0.4,rely=0.2)
bt = tk.Button(root2,text='关闭',command=root2.destroy)
bt.place(relx=0.5,rely=0.4)
button = tk.Button(root,text='弹出子窗口',command=newwindow)
button.place(relx=0.4,rely=0.4)
root.mainloop()
运行效果如图所示:
十六、对话框
对话框主要分为:
消息对话框(要引入tkinter下的messagebox包);
输入对话框(要引入tkinter下的simpledialog包);
文件选择对话框(要引入tkinter下的filedialog包);
颜色选择对话框(要引入tkinter下的colorchooser包);
1、消息对话框
(1)确认、取消对话框 askokcancel()
import tkinter as tk
import tkinter.messagebox as box
def askokcancel():
box.askokcancel(title='确认取消对话框',message='这是个确认取消对话框')
root = tk.Tk()
root.title('对话框')
root.geometry('480x260+500+300')
button = tk.Button(root,text='确认取消对话框',command=askokcancel)
button.place(width=100,height=50,y=100,x=200)
root.mainloop()
运行效果如图:
(2)是、否对话框 askquestion() ( 或askyesno() )
import tkinter as tk
import tkinter.messagebox as box
def askokcancel():
box.askyesno(title='是否对话框',message='这是个是否对话框')
root = tk.Tk()
root.title('对话框')
root.geometry('480x260+500+300')
button = tk.Button(root,text='是否对话框',command=askokcancel)
button.place(width=100,height=50,y=100,x=200)
root.mainloop()
运行效果如图:
(3)重试、取消对话框 askretrycancel()
import tkinter as tk
import tkinter.messagebox as box
def askokcancel():
box.askretrycancel(title='重试取消对话框',message='这是个重试取消对话框')
root = tk.Tk()
root.title('对话框')
root.geometry('480x260+500+300')
button = tk.Button(root,text='重试取消对话框',command=askokcancel)
button.place(width=100,height=50,y=100,x=200)
root.mainloop()
运行效果如图:
(4)是、否、取消对话框 askyesnocancel()
import tkinter as tk
import tkinter.messagebox as box
def askokcancel():
box.askyesnocancel(title='是否取消对话框',message='这是个是否取消对话框')
root = tk.Tk()
root.title('对话框')
root.geometry('480x260+500+300')
button = tk.Button(root,text='是否取消对话框',command=askokcancel)
button.place(width=100,height=50,y=100,x=200)
root.mainloop()
运行效果如图:
(5) 错误消息框 showerror()
import tkinter as tk
import tkinter.messagebox as box
def askokcancel():
box.showerror(title='错误消息对话框',message='这是个错误消息对话框')
root = tk.Tk()
root.title('对话框')
root.geometry('480x260+500+300')
button = tk.Button(root,text='错误消息对话框',command=askokcancel)
button.place(width=100,height=50,y=100,x=200)
root.mainloop()
运行效果如图:
(6)信息提示框 showinfo()
import tkinter as tk
import tkinter.messagebox as box
def askokcancel():
box.showinfo(title='信息提示对话框',message='这是个信息提示对话框')
root = tk.Tk()
root.title('对话框')
root.geometry('480x260+500+300')
button = tk.Button(root,text='信息提示对话框',command=askokcancel)
button.place(width=100,height=50,y=100,x=200)
root.mainloop()
运行效果如图:
(7)警告框 showwarning()
import tkinter as tk
import tkinter.messagebox as box
def askokcancel():
box.showwarning(title='警告对话框',message='这是个警告对话框')
root = tk.Tk()
root.title('对话框')
root.geometry('480x260+500+300')
button = tk.Button(root,text='警告对话框',command=askokcancel)
button.place(width=100,height=50,y=100,x=200)
root.mainloop()
运行效果如图:
以上就是消息对话框,共有7个。
2、输入对话框
先导入包:
import tkinter.simpledialog
(1)askstring() 对话框(接收字符串输入)
import tkinter as tk
import tkinter.simpledialog as dia
def askokcancel():
a = dia.askstring(title='askstring对话框',prompt='请输入一串内容:')
print(a)
root = tk.Tk()
root.title('输入对话框')
root.geometry('480x260+500+300')
button = tk.Button(root,text='askstring对话框',command=askokcancel)
button.place(width=100,height=50,y=100,x=200)
root.mainloop()
运行效果如图:
(2)askinteger() 对话框(接收整数输入)
import tkinter as tk
import tkinter.simpledialog as dia
def askokcancel():
a = dia.askinteger(title='askinteger对话框',prompt='请输入整数内容:')
print(a)
root = tk.Tk()
root.title('输入对话框')
root.geometry('480x260+500+300')
button = tk.Button(root,text='askinteger对话框',command=askokcancel)
button.place(width=100,height=50,y=100,x=200)
root.mainloop()
运行效果如图:
(3) askfloat() 对话框 (接收浮点数输入)
import tkinter as tk
import tkinter.simpledialog as dia
def askokcancel():
a = dia.askfloat(title='askfloat对话框',prompt='请输入浮点数:')
print(a)
root = tk.Tk()
root.title('输入对话框')
root.geometry('480x260+500+300')
button = tk.Button(root,text='askfloat对话框',command=askokcancel)
button.place(width=100,height=50,y=100,x=200)
root.mainloop()
运行效果如图:
3、文件选择对话框
先导入包:
import tkinter.filedialog
弹出文件选择对话框,主要有以下常用方法:
方法 | 作用 | 返回数据类型 |
askopenfilename() | 打开一个文件 | 文件名字符串(且包含文件路径) |
askopenfilenames() | 打开多个文件 | 元组 |
asksaveasfilename() | 保存文件 | 文件名字符串(且包含文件路径) |
代码展示:
import tkinter as tk
import tkinter.filedialog as dia
def askokcancel():
file1 = dia.askopenfilename()
file2 = dia.askopenfilenames()
file3 = dia.asksaveasfilename()
print(type(file1),file1,'\n',type(file2),file2,'\n',type(file3))
root = tk.Tk()
root.title('文件选择对话框')
root.geometry('480x260+500+300')
button = tk.Button(root,text='文件选择对话框',command=askokcancel)
button.place(width=100,height=50,y=100,x=200)
root.mainloop()
运行结果如图:
4、颜色选择对话框
先导入包:
import tkinter.colorchooser
使用 askcolor()弹出颜色选择对话框,askcolor()返回的数据类型是一个元组
import tkinter as tk
import tkinter.colorchooser as color
def askokcancel():
a = color.askcolor()
print(type(a))
root = tk.Tk()
root.title('颜色选择对话框')
root.geometry('480x260+500+300')
button = tk.Button(root,text='颜色选择对话框',command=askokcancel)
button.place(width=100,height=50,y=100,x=200)
root.mainloop()
十七、绑定事件
将需要执行的事件与函数绑定,通过鼠标或键盘点击来响应触发函数执行,其用法如下:
控件实例.bind('<事件代码>',函数名) #注意函数名后不接括号
常见的事件代码如下所示:
事件 | 事件代码 | 其他 |
单击鼠标右键 | <ButtonPress-3> | 可以简写为<3>、<Button-3> |
单击鼠标中键 | <ButtonPress-2> | 可以简写为<2>、<Button-2> |
单击鼠标左键 | <ButtonPress-1> | 可以简写为<1>、<Button-1> |
释放鼠标右键 | <ButtonRelease-3> | |
释放鼠标中键 | <ButtonRelease-2> | |
释放鼠标左键 | <ButtonRelease-1> | |
按住鼠标右键移动 | <B3-Motion> | |
按住鼠标中键移动 | <B2-Motion> | |
按住鼠标左键移动 | <B1-Motion> | |
双击鼠标左键 | <Double-Button-1> | |
鼠标进入控件实例 | <Enter> | |
鼠标离开控件实例 | <Leave> | |
拨动鼠标滚轮 | <MouseWheel> | |
键盘任意键 | <Key> | |
回车 | <Return> | |
空格 | <Space> | |
字母和数字 | <Key-字母> | |
功能键 | <Fn> (如:<F1> <F2>等) | |
方向键 | <Right>、<Left>、<Up>、<Down> | |
组合键 | 键名之间用减号 - 连接 | 需要注意大小写 |
注意:在进行事件与函数绑定的时候,需要为自定义的函数传入参数 event。event常见属性如下:
属性 | 作用 |
event.x或event.y (x,y要小写) | 绑定事件触发时,获取相对于控件实例的左边距离x,上边距离y (单位:像素) |
event.root_x或event.root_y (x,y要小写) | 获取相对于屏幕左上角的坐标值 (单位:像素) |
keysysm | 字符(或字符型)按键名称 |
keysysm_num | 按键的十进制ASCII码值 |
char | 可显示的字符 |
下面以列表框那节的例子(新加绑定鼠标左键松开)演示一下:
import tkinter as tk
#单击鼠标左键响应事件
def ini():
teachers = ['张三','李五','王六']
course = ['python','java','c++']
for i in teachers:
lisbox1.insert(0,i)
for j in course:
lisbox2.insert('end',j)
def add(event):
s = '老师:'+lisbox1.get(lisbox1.curselection())+','+'教授课程:',\
lisbox2.get(lisbox1.curselection())
lisbox3.insert(0,s)
root = tk.Tk()
root.geometry('480x300')
root.title('绑定事件')
#创建Frame框架
frame1 = tk.Frame(root,relief='sunken',)
frame1.place(x=0,width=150,height=250)
frame2 = tk.Frame(root,relief='sunken')
frame2.place(x=150,width=150,height=250)
frame3 = tk.Frame(root)
frame3.place(x=300,width=250,height=250)
#创建列表框
lisbox1 = tk.Listbox(frame1,font='微软雅黑')
#注意 这里设置的width=150,height=500,是被第九行设置的宽度和高度限制的,
# 虽然这里设置了500的高,但实际只能显示250
lisbox1.place(width=150,height=500)
#绑定鼠标左键松开事件
lisbox1.bind('<ButtonRelease-1>',add)
lisbox2 = tk.Listbox(frame2,font='微软雅黑')
lisbox2.place(width=150,height=500)
lisbox3 = tk.Listbox(frame3,font='微软雅黑')
lisbox3.place(width=250,height=500)
ini()
root.mainloop()
效果如图所示:
注意:在绑定鼠标事件的时候,建议绑定鼠标左键松开(<ButtonRelease>),而不是绑定鼠标左键点击(<ButtonPress-1>),这样会很打脑壳,因为我一开始就是这样弄的,给大家看下,很麻烦。
如上图我第一次点击‘张三’,但却没有显示在右侧的列表框
接着,又点击了两次 ‘李五’,这时右侧有显示,但明显不对
总结:
以上这些就是Tkinter模块学习第三部分要分享的了,到这里Tkinter模块学习也差不多结束了,画布的话要后面在学了,因为是最后一部分了,内容比较之前的可能有点多,又是初学,内容难免有不严谨或错误之处,希望大家可以来评论留言之处,我们一起学习,谢谢大家看我写的小东西,谢谢!