文章目录
说明
- tkinter为python自带的内置库,不需要安装。适合开发小工具等。大型应用建议pyqt5.
import tkinker as tk
tk._test() # 测试tkinter是否正常,导入,使用,查看版本等
Demo
创建一个窗口
import tkinter as tk
# 实例tk对象
root = tk.Tk()
# 设置窗口标题
root.title('Hello World!')
# root.wm_title('Hello World')
# 事件循环
root.mainloop()
标签–Label
from tkinter import *
root = Tk()
root.title('Hello World!')
# 绑定标签和root,text==提示信息
wl = Label(root, text='第一个标签:')
# 布局方式pack(),自动布局,常用
wl.pack()
root.mainloop()
组件与按钮
tkinter中,有21个常用的核心组件,他们提供了最基本的功能,使用频率较高。
Toplevel、Label、Button、Canvas、Checkbutton、Entry、Frame、LabelFrame、Listbox、Menu、Menubuttonn、Message、OptionnMenu、PaneWindow、Radiobutton、Scale、Scrollbar、Text、Bitmap、Image
使用
绑定方式通常有:
- 在按钮组件被声明的时候用command属性声明,command属性接受一个函数名
from tkinter import *
root = Tk()
i = 0
def my_label():
global root, i
s = Label(root, text=f'在窗口中点了{i}次')
s.pack()
i += 1
b = Button(root, text='点点点', command=my_label)
b.pack()
root.mainloop()
- 使用bind方法,常用,可以绑定多个事件
from tkinter import *
root = Tk()
i = 0
def my_label(event): # event表示接受的事件
global root, i
s = Label(root, text=f'在窗口中点了{i}次')
s.pack()
i += 1
b = Button(root, text='点点点')
# "<Button-1>"表示鼠标左键点击一次
b.bind("<Button-1>", my_label)
b.pack()
root.mainloop()
设置属性
from tkinter import *
root = Tk()
i = 0
b1 = Button(root, text='按钮1')
b1['width'] = 20
b1['height'] = 4
b1.pack()
b2 = Button(root, text='按钮2')
b2['width'] = 20
b2['background'] = 'red'
b2.pack()
root.mainloop()
布局
- pack: 简单。不用做太多设置,直接使用pack函数即可
接受的参数
1、side : 参数指定它停靠在那个方向,可以为:LEFT、TOP、RIGHT、BUTTOM(左上右下)
2、fill:参数可以为X、Y、BOTH和NONE,即在水平、垂直方向填充,水平和垂直方向填充和不填充
3、expand:参数可以是YES和NO,它的anchor参数可以是N、E、S、W(北东南西,上右下左)以及他们的组合或者是CENTER(表中间)
4、ipadx: 表示内边距的x方向,它的ipady表示的是内边距的y方向,padx表示的是外边距的x方向,pady表示的是外边距的y方向
from tkinter import *
root = Tk()
Button(root, text='A').pack(side=LEFT, expand=YES, fill=Y)
Button(root, text='B').pack(side=TOP, expand=YES, fill=BOTH)
Button(root, text='C').pack(side=RIGHT, expand=YES, fill=BOTH)
Button(root, text='D').pack(anchor=SE)
root.mainloop()
- grid:可以理解为网格或者表格,它可以把 界面设置为几行几列的网格,我们在网格里插入我们想要的元素。这种布局的好处是 不管我们如何拖动窗口,相对位置是不会变化的,而且这种布局也超简单
1、由于我们的程序大多数都是矩形,一次特别适合网格布局
2、使用grid布局的时候,我们使用grid函数,在里面指定聊个参数,用row表示行、colum表示列,注意的是row和colum的编号都从0开始。
3、grid函数还有个sticky参数,它可以用NSWE表示上下左右,它决定了这个组件是从那个方向开始的,下面的例子可以解释这一点。
4、grid布局直接使用后面的行和列的数字来指定它位于那个位置,而不必使用其他参数。
5、grid函数也支持注入 ipadx、ipady、padx、pady,他们的意思和pack函数一样,默认边距都是0.
6、它还支持比如rowspan,表示跨越的行数,columnspan表示跨越的列数。
from tkinter import *
root = Tk()
Label(root, text='账号:').grid(row=0, sticky=W)
Entry(root).grid(row=0, column=1, sticky=E)
Label(root, text='密码:').grid(row=1, sticky=W)
Entry(root).grid(row=1, column=1, sticky=E)
Button(root, text='登录').grid(row=2, column=1, sticky=E)
root.mainloop()
- place:它直接使用死板的位置坐标来布局,这样做的最大的问题在于当我们向窗口添加一个新部件的时候,有的重新测一遍数据,且我们不能随意地改变大小,否则可能会导致错乱。
一般不用,比较笨拙。
事件及其绑定
- bind函数
- bind 函数的调用规则:窗体对象
.bind(事件类型,回调函数)
- 常用的事件
- <button-1>表示左键单击,其中的1换成3 表示右键, 2为鼠标中键(不常用)
- <keyPress-A>表示A键被按下,A可以换成其他
- <Control-V>表示按下的是Ctrl和V键,V可以换成其他
- <F1>表示按下F1键,对于fn系列,都可以换
绑定事件不仅可以使button,也可以是Label
bind
- 关于bind函数,还有两个版本,使用方面不同。
- 可以在全程序级别的绑定,使用bind_all,它的参数类型和bind一样,它通常用于全局的快捷键,比如F1通常为打开帮助文档。
- 还可以绑定某些类别,使用bind_class,它接受第三个参数,第一个参数是类名,第二个参数是事件类型,第三个参数是相应的操作,比如 w.bind_class(‘Entry’,’<Control-V>’,my_paste),他就是绑定了所有的输入框的ctrl+v表示粘贴
解除绑定
- 解除绑定我们使用
unbind
方法,和bind类似 unbind
方法只需要一个参数即可,只需要接触绑定的事件类型,因为它解除绑定事件类型的所有回调函数。
输入框
输入框是 Entry
比较重要的就是get函数,get函数使用的时候不需要任何参数,它的返回值就是改输入框的内容。
密码框
- 其实密码框和输入框基本实一样的,
- 只是文本变成特殊符号
- ex:e是一个输入框,我们可以设置他的show属性让他变成一个密码框,即
e['show']='*'
即可
菜单与选择按钮
简介
> 菜单的信息量是非常巨大的,由于菜单又可以有子菜单,因此又可以有子菜单。
> 菜单的分类也很多,通常可以氛围下拉菜单、弹出菜单等等。
添加顶层菜单
1.我们可以使用Menu
类来新建一个菜单,Menu
和其他组件一样,第一个是parent
,第一个通常为窗口。
2. 然后我们就可以用add_command方法来为它添加菜单选项,如果该菜单是顶级菜单,则添加的菜单项依次向右添加,如果菜单是一个菜单项,则它添加的下拉菜单的菜单项
3. add_command
中的参数常用的有label
属性,用来指定的是菜单项的名称,command
属性用来指定被点击的时候调用的方法,acceletor
属性指定的是快捷键,underline属性是 是否有下划线,
4. 最后可以用窗口Menu
属性指定我们使用哪一个作为它的顶层菜单
from tkinter import *
root = Tk()
menu_bar = Menu(root)
for i in ['文件', '编辑', '视图', '关于']:
menu_bar.add_command(label=i)
root["menu"] = menu_bar
root.mainloop()
添加子菜单
- 如果有子菜单,则情况稍微复杂点,这个时候,我们需要使用
add_cascade
,cascade
可以理解为‘级联’,即它的作用只是为了引出后面的菜单。 add_cascade
的一个很重要的属性就是menu
属性,它指明了要把那个菜单级联到该菜单项上,当然,还必不可少的就是label属性,用于指定该菜单项的名称。- 我们先新建一个Menu的实例,然后使用
add_command
来添加菜单项,这样等该菜单建立完毕,我们要把它作为另一个菜单项的子菜单,就需要add_cascade
方法。
from tkinter import *
root = Tk()
menu_bar = Menu(root)
fMenu = Menu(menu_bar) # 文件
for i in ['新建', '打开', '保存', '另存为', '退出']:
fMenu.add_command(label=i)
eMenu = Menu(menu_bar) # 编辑
for i in ['复制', '粘贴', '剪贴', '撤销']:
eMenu.add_command(label=i)
vMenu = Menu(menu_bar) # 视图
for i in ['默认视图', '全屏模式', '显示/隐藏菜单']:
vMenu.add_command(label=i)
aMenu = Menu(menu_bar) # 关于
for i in ['版权信息', '帮助文档']:
aMenu.add_command(label=i)
menu_bar.add_cascade(label='文件', menu=fMenu)
menu_bar.add_cascade(label='编辑', menu=eMenu)
menu_bar.add_cascade(label='视图', menu=vMenu)
menu_bar.add_cascade(label='关于', menu=aMenu)
root["menu"] = menu_bar
root.mainloop()
弹出菜单(右键菜单)
1、弹出菜单又叫上下文菜单
,也叫右键菜单
,它通常是鼠标单击右键产生的菜单
2、其实很多界面库都是给出了弹出菜单的简单的制作方法,但是tkinter里面我们却只能使用比较原始的事件绑定的方式去做。
3、大体思路是,先新建一个菜单,然后向菜单中添加各种功能,最后我们监听鼠标右键的事件,如果右键被单击,此时我们可以根据需要判断鼠标的位置来确定是那个弹出菜单
被弹出,然后使用Menu
类的pop
方法来弹出菜单。
4、Menu
类中有一个post
方法,它接受两个参数,即x
和y
坐标,他会在相应的位置弹出菜单。
from tkinter import *
root = Tk()
def my_label():
global root
Label(root, text='Python课程').pack() # 点击Python后添加这个标签
menu_bar = Menu(root)
for i in ['C/C++', "JaveEE", 'Android', "PHP", "IOS", "H5", "云计算"]:
menu_bar.add_command(label=i)
menu_bar.add_command(label="Python", command=my_label)
def pop(event):
menu_bar.post(event.x_root, event.y_root)
root.bind("<Button-3>", pop)
root.mainloop()
插入分割线
from tkinter import *
root = Tk()
menu_bar = Menu(root)
sonMenu = Menu(menu_bar)
for i in ['C/C++', "JaveEE", 'Android']:
sonMenu.add_command(label=i)
sonMenu.add_separator() # 插入分割线
for i in ["PHP", "IOS", "H5", "云计算"]:
sonMenu.add_command(label=i)
menu_bar.add_cascade(label='list', menu=sonMenu)
root['menu'] = menu_bar
root.mainloop()
radiobutton和checkbutton
1、radiobutton
单选按钮 checkbuttonn
复选按钮
from tkinter import *
root = Tk()
menu_bar = Menu(root)
sonMenu = Menu(menu_bar)
for i in ['C/C++', "JaveEE", 'Android']:
sonMenu.add_radiobutton(label=i) # 注意 add_radiobutton
sonMenu.add_separator() # 插入分割线
for i in ["PHP", "IOS", "H5", "云计算"]:
sonMenu.add_checkbutton(label=i) # 注意 add_checkbutton
menu_bar.add_cascade(label='list', menu=sonMenu)
root['menu'] = menu_bar
root.mainloop()
对话框和消息框
对话框
1、关于对话框,tkinter有他自己的布局,在pytho的安装目录下 Lib
文件夹的tkinter子文件夹下,有个dialog,2KB
2、其中有一个_test
用来测试的
3、该类的属性很少,基本上比较好用的只有一个num
属性,用于返回用户的点击
from tkinter.dialog import *
from tkinter import *
def my_dialog():
d = Dialog(None, title="Python调查", text='喜欢Python嘛?', bitmap=DIALOG_ICON, default=0, strings=(
'喜欢', '很喜欢', '非常喜欢'))
print(d.num)
btn_begin = Button(None, text='Python调研', command=my_dialog)
btn_begin.pack()
btn_quit = Button(None, text='quit', command=btn_begin.quit)
btn_quit.pack()
btn_begin.mainloop()
代码说明:在新建一个对话框的时候,title属性,text属性,bitmap属性等等都是不可缺少的,否则会报错
其他对话框
simpledialog(简单对话框)、commonddialog(一般对话框)、filedialog(文件对话框)、colorchooser
消息框
Lib\messagebox.py
from tkinter.messagebox import *
showinfo(title="消息框", message='铁皮憨憨')
常用控件介绍
复选按钮
Checkbutton
复选按钮 Radiobutto
单选按钮
from tkinter import *
root = Tk()
bthA = Checkbutton(root, text="Python")
bthA.pack()
bthB = Checkbutton(root, text="Java")
bthB.pack()
bthC = Checkbutton(root, text="Java")
bthC.pack()
bthD = Checkbutton(root, text="Java")
bthD.pack()
root.mainloop()
文本域
of:所谓文本域,即文本,其实它可以看作是一个大型的文本框,属性多了点
from tkinter import *
root = Tk()
t = Text(root, width=50, height=30)
t.pack()
root.mainloop()
Canvas
1、canvas
理解为一个画布,用于绘制图形
2、它也是一个控件,但是他在上面的区域,可以用于手工绘制。
from tkinter import *
root = Tk()
root.title('root')
canv = Canvas(root, width=400, height=300, bg='pink')
canv.create_line((0,0), (200,200), width=8)
canv.create_text(300,30,text='Python')
canv.pack()
root.mainloop()
Toplevel(多窗口)
1、一个toplevel可以理解为一个新的窗口,他是一个顶层的窗口
2、新建一个toplevel很简单,只需要实例化该类即可,这也是创建多窗口应用的一个途径。
ex:
from tkinter import *
root = Tk()
root.title('root')
lr = Label(root, text='root', width=50, height=50)
lr.pack()
top = Toplevel(root, width=60, height=60)
top.title('Toplevel')
lt = Label(top, text='top')
lt.pack()
root.mainloop()
窗口美化
1、title修改窗口的默认标题,该参数接受一个字符串
2、我们还可以用geometry函数来控制窗口大小,接受一个字符串类型的参数,但是它的格式很严格,
width x height + xoffset + yoffset
,比如300x280+150+200
就是一个合格的参数,注意的是这里的x是xyx的x,不是乘号
3、如果想去除边框,还可以用overridereddirect方法,只 需要把参数设置为1即可,
4、如果想修改标题栏的默认图标,可以使用iconbitmap
方法或者wm_iconbitman方法,接受一个ico文件。
from tkinter import *
root = Tk()
root.title('root')
root.geometry("800x500+600+200")
root.iconbitmap('logo.ico')
root.mainloop()
ttk(tkinter升级版)
- ttk的出现因为大家对于tkinter的不满,为了让他在windows平台运行的更像windows。支持不同的风格
- ttk支持原来的21个组件中的11个,并且引入六个新的组件:
combobox
、notebook
、progressbar
、separator
、sizegrip
、treeview
from tkinter import *
from tkinter.ttk import *
root = Tk()
bth = Button(root, text='ttk!--yes')
bth.pack()
root.mainloop()
win7支持效果差,模糊率