在我们平时写代码的时候,为了让程序效果显得更直观,我们通常都会给它们套上一层美丽的外衣, 这层外衣便是-------GUI,中文名又叫,图形用户接口,能起到很好的交互作用。下面我们来着重介绍下Python中自带的GUI模块-----tkinter,看看他有哪些丰富的图形接口吧。 1.安装并导入哦,tkinter系统自带,无需安装,直接导入即可: import tkinter as tk # 因为它比较长,所以 给他个简写的方式 ,用t代表它。
2.实例化窗口root= tk.Tk() #主窗口 root.title('hello') #窗口标题 root.geometry('400x500') #窗口尺寸 root.wm_minsize(140, 170) # 设置窗口最小化大小 root.wm_maxsize(1440, 2800) # 设置窗口最大化大小 root.iconbitmap('1.ico') #窗口图标 必须是ico格式的图片 root.resizable(width=False, height=True) # 设置窗口宽度不可变,高度可变 root.mainloop() #主窗口循环显示
我们的第一个窗口就这样应运而生了,另外他还有许多其他功能,比如: root.quit() #退出 root.destroy() #销毁 root.update() #刷新 可以接收用户改变程序进程 root.update_idletasks() #刷新 不能接收用户改变程序进程 root.wm_title('i love you') #最小化显示字样 root.configure(background='blue') #背景颜色
下面我们再给他添加点别的部件和功能吧。
3.基本部件tkinter里面有很多丰富的部件,有标签,文本框,列表框,下拉列表框,多选框,单选框等等,下面我们一起认识下他们吧。 一、标签它是tkinter里面的标签部件,主要用于提示。那么他有哪些有趣的功能了,一起看一下: label=tk.Label(root, text='Hello', #标签内文本 bg='red', #背景颜色 font=('Arial',20), #字体和字体大小 width=10, #文本宽度 height=5 #文本高度 )
不过我们光这样标签还不会添加到我们的主界面中,还得给他进行下一步操作: label.pack() #添加部件到主界面
下面看下效果:
这样我们就成功将他添加进来了,有点丑,等会我们在做修改。大家可以看到现在的标签里的值是静态无法修改的,那要是我们想让他动态变更了,那我们可以这样做:
这样就达到了修改标签的值的功能 关于标签还有许多优秀的方法,比如说: label.configure(text) #重新设置标签文本 得是text的时候设置才生效 label.configure(background='blue') #重新设置标签背景
标签的属性总共有下面几种: anchor 文本位置; background(bg) 背景色; foreground(fg) 前景色; borderwidth(bd) 边框宽度; width 标签宽度; height 标签高度; bitmap 标签中的位图; font 字体; image 标签中的图片; justify 多行文本的对齐方式; text 标签中的文本,可以使用'n'表示换行 textvariable 显示文本自动更新,与StringVar等配合着用
二、按钮按钮的功能主要是实现点击功能,比如说确认,提交操作。那么他有哪些操作了:
可以看出,成功实现了点击事件,而且我们可以通过点击按钮来改变标签的值,下面来看看:
可以看出,成功的改变了值和背景颜色,奥利给。大家可能对上图中的side='left'有点不理解,其实那个就是确定组件位置的,一个左一个右。按钮还有一个隐藏和显示的功能也是相当好实现的: button.pack #显示 button.pack_forget #隐藏
关于button还有以下方法供大家学习: tanchor t文本位置; tbackground(bg) 按钮的背景色; bitmap: 按钮上显示的位图; borderwidth(bd) 按钮边框的宽度; command: 按钮消息的回调函数; cursor: 鼠标移动到按钮上的指针样式; font: 按钮上文本的字体; foreground(fg) 按钮的前景色; height: 按钮的高度; image: 按钮上显示的图片; state: 按钮的状态(disabled); text: 按钮上显示的文本; width: 按钮的宽度 padx 设置文本与按钮边框x的距离,还有pady; activeforeground 按下时前景色 textvariable 可变文本,与StringVar等配合着用
三、文本框,多行文本框之所以拿来一起讲,是因为他们很多参数都是一样的,所以没必要分开讲,我们先来说说文本框: 1.文本框用来接受用户输入,常用来登陆账号和密码
可以看到一个显示为汉字,另一个则是?,这就是他的明文和密文设置了。我们还可以获取到它里面的值用来校验数据库中的信息以便登陆,不过这里我们只把它打印出来即可:
完美将他打印了出来,小伙伴们看到这里是不是可以写个登陆系统嘞嘞。单行文本框自定义插入值: e1.insert(index,string) #在指定索引位置插入字符串
2.多行文本框与文本框不同的是,它可以显示多行信息,一般用来显示某些结果。
可以看到,多行文本就是这样的,我们可以给他插入文本: tt.insert('insert','你是猪吗') #首行插入 tt.insert('current','我是猪') #当前插入 tt.insert('end','123') #末尾插入
除了插入还可以删除: tt.delete('1.0',tk.END) #删除文本框所有内容
另外文本框有时候需要实时更新内容所以还有一个方法: tt.update() #更新多行文本框内容
除此之外,我们还可以在多行文本框中添加其他组件实现一些功能。 1.记住密码功能
2.照片查看器我们需要认识一个新的方法,他叫PhotoImage,他的设计比较古怪,个人觉得,因为他只支持gif图片。
通过上面的设置创建了一个window执行函数,在实际应用中可以用它来实现记住密码和查看gif照片的功能。 关于文本框和多行文本框就说到这里,他们还有很多其他的方法: 指定位置插入值:tt.mark_set("here","3.2") #建立mark,相当于索引,第三行第二列 tt.insert('here',"hello") #插入hello tt.mark_unset('here') #删除mark
高亮显示文本:tt.tag_add('tag1','1.3','2.1','2.2') #设置要设置样式的区域 tt.tag_config("tag1",background="green",foreground="blue") tt.tag_config("tag2",background="blue",foreground="red")#如设置多个样式则新样式覆盖旧样式 tt.tag_lower("tag1") #可通过tagraise()和tag_lower()方法来提高和降低某个Tag的优先级
获取多行文本框的值:tt.get('0.0','end')
文本绑定鼠标事件:tt.tag_add("link","2.1","2.5") tt.tag_config("link",foreground="blue",underline=True) #选中的内容添加下划线 蓝色背景颜色 def show_1(event): tt.config(cursor="arrow") #鼠标箭头型 def show_2(event): tt.config(cursor="xterm") #鼠标I型 def click(event): print('我被单机了') tt.tag_bind("link","",show_1) tt.tag_bind("link","",show_2) tt.tag_bind("link","",click)
恢复,撤销:tt.edit_undo() #撤销 tt.editredo() #恢复
更多精彩内容:tbackground(bg) 文本框背景色; foreground(fg) 前景色; selectbackground 选定文本背景色; selectforeground 选定文本前景色; borderwidth(bd) 文本框边框宽度; font 字体; show 文本框显示的字符,若为*,表示文本框为密码框; state 状态; width 文本框宽度 textvariable 可变文本,与StringVar等配合着用
四、单选框,复选框这个我们平时勾选答案是单选还是多选时很常见。下面让我们来看看吧: 1.单选框Radiobutton
2.复选框Checkbutton
可以看出,做出来了,不过有点复杂,因为没有善用循环,下面给出一种简单的写法:
可以看到,几行代码就把四个控件列出来了。关于单选框多选框还有很多有趣的方法: tanchor 文本位置; background(bg) 背景色; foreground(fg) 前景色; borderwidth 边框宽度; width 组件的宽度; height 组件高度; bitmap 组件中的位图; image 组件中的图片; font 字体; justify 组件中多行文本的对齐方式; text 指定组件的文本; value 指定组件被选中中关联变量的值; variable 指定组件所关联的变量; indicatoron 特殊控制参数,当为0时,组件会被绘制成按钮形式; textvariable 可变文本显示,与StringVar等配合着用
五、listbox列表列表常用于选择选项。
这个比较简单,没什么好说的。
六、滑块条,滚动条1.滑块条一行代码就能搞定了,也是非常简单:
默认方向为垂直,只需将orient属性设为horizontal(tk.HORIZONTAL )即可,也可设为垂直:orient="vertical"
2.滚动条常和其他组件配套使用,比如列表框,多行文本框。安装滚动条之前需要做两件事情。 1.指定该组件的yscrollbarcommand参数为Scrollbar的set()方法 2.指定Scrollbar 的 command 参数为该组件的 yview() 方法 由于滚动条一般都是垂直方向,所以我们不改动他的方向。
可以看到,我们的滚动条和列表组件产生了联系,滚动条滚动列表内容相应往下翻,如果你要想设置滚动条的位置,只需: sl.set(0.5,1) #使滚动条始终保持在中间位置
滚动条和滑块条一样,都比较简单,项目中用的也不是蛮多,总体来说比较简单的组件。
七、画布平时会用于绘制各种曲线和位图,canvas可以很轻松创建各种有趣的图形图像。下面来了解下 #初始化一个200x100的背景颜色为蓝色的形状 canvas = tk.Canvas(root, bg='blue', height=100, width=200)
#创建一个矩形,背景色为绿色,边框线颜色为红色,线宽为2,虚线长度为3,画刷为gray12, jx=canvas.create_rectangle(100,100,50,50,fill='green',outline='red',width=2,dash=3,stipple = 'gray12')
#绘制弧形 风格为pieslice(chord扇形,抛物线arc) 起始角度0 角度偏移量180 hx=canvas.create_arc(50, 100,140, 200,style='pieslice',start=0, extent=180)
#创建直线 坐标为100,100的长度为200x200的直线,一头有箭头(none无,last尾部,both两端,箭头形状) zx=canvas.create_line(100, 100, 200, 200,arrow='first',arrowshape='30 20 10')
#创建椭圆,背景色为red y=canvas.create_oval(50, 100,140, 200, fill='red')
#创建多边形 直角三角形 dbx=canvas.create_polygon((150,150,150,200,70,200),fill = 'red')
#创建文字 居中显示 wz=canvas.create_text((10,10),text = 'Hello Text',anchor ='w') canvas.select_from(wz,3) # 设置文本的选中开始位置 canvas.select_to(wz,7)# 设置文本的选中结束位置
#创建位图,类型为error(info信息,question问题,hourglass沙漏) canvas.create_bitmap((40,40),bitmap = 'error')
#创建gif img= tk.PhotoImage(file='1.webp') canvas.create_image(10, 10, anchor='nw', image=img)
#创建组件 bt =tk.Button(canvas,text='hello',command) canvas.create_window((100,100),window=bt,anchor='w')
#将jx移动到另一区域 cv.coords(jx,(10,10,20,20))
#移动图形右移20个px,再返回 canvas.move(jx,20,0)
#删除图形 canvas.delete(jx)
#添加绑定事件,只有点击到矩形边框才有效 canvas.tag_bind('jx','',command) #左键为1,右键为3,滚轮2
canvas绘图还是比较强大的,以上的知识点差不多够平时用了,可以看到:
八、下拉列表框一般用于某个功能的配套选择,这个部件在tkinter中的ttk模块下,和其他的不同,所以我们导入ttk: #打印下拉列表框的值 from tkinter import ttk def function(*arg): tprint(cb.get()) #获取下拉列表框的值 cb=ttk.Combobox(root, width=12,state='readonly')#下拉列表框宽度为12 只读 cb['values'] = ('请选择-----','1','2','3','4') #设置下拉列表框的内容 cb.current(0) #将当前选择状态置为0,也就是第一项 cb.bind("<>",function) #绑定function函数,然后触发事件 cb.pack()
注:下拉列表没有command参数,但是他可以设置textvariable进行参数传递。
九、菜单栏,菜单按钮,选项菜单先说说我们熟知的菜单(Menu),它主要我们为了简化软件的使用而建立的,避免添加过多的控件。那么他是如何建立的了,请看: 1.下拉菜单#创建菜单栏 m=tk.Menu(root)
#定义一个父菜单 file=tk.Menu(m,tearoff=False)
#将上面定义的父菜单命名为File,放在菜单栏中 m.add_cascade(label='文件', menu=file)
#在File中加入下拉菜单,并添加对应命令操作。 #如果点击这些选项, 就会触发相应的功能 file.add_command(label='新建',accelerator='Ctrl+N') file.add_command(label='打开', accelerator='Ctrl+O') file.add_command(label='保存', accelerator='Ctrl+S')
#添加一条分割线 file.add_separator() file.add_command(label='退出',command=root.quit,accelerator='Ctrl+Q') edit= tk.Menu(m,tearoff=False) m.add_cascade(label='编辑', menu=edit) edit.add_command(label='剪切',accelerator='Ctrl+X') edit.add_command(label='复制',accelerator='Ctrl+C') edit.add_command(label='粘贴',accelerator='Ctrl+V') #二级菜单 s= tk.Menu(file,tearoff=False) file.add_cascade(label='导入', menu=s) s.add_command(label="模块") s.add_command(label="文本文件")
#三级菜单 z=tk.Menu(s,tearoff=False) s.add_cascade(label='图片',menu=z) z.add_command(label="gif") z.add_command(label="jpg") z.add_command(label="png") z.add_command(label="bmp") root.configure(menu=m)
2.右键弹出菜单在做这个之前我们要了解鼠标绑定事件爱你,因为右键弹出需要击键,所以我们需要了解它。 既然是右键我们当然得绑定右键了: root.bind("",function)
然后我们书写绑定函数并把他绑定到当前对象中: def function(event): m.post(event.x_root, event.y_root) #可以替换菜单,变为其他菜单,比如说s,z
这样就实现了右键弹出菜单的功能,是不是很简单了。关于菜单的操作还有许多,不一一演示,下面请看: #添加一个子菜单 coption为配置选项 add_cascade(option)
#添加一个切换按钮 coption为配置选项 add_checkbutton(option)
#添加一个功能按钮 coption为配置选项 add_command(option)
#添加一个单选按钮 coption为配置选项 add_radiobutton(option)
#添加一个分割线 add_separator()
#删除index1 到 index2之间的选项 delete(index1,index2)
#获取菜单某一项的属性值 entrycget(index,coption)
#重新配置菜单中某项的属性 entryconfigure(index,option)
#返回参数位置对应的选项索引 index(i)
#在指定位置插入一个子菜单 insert_cascade(index,option)
#在指定位置插入一个切换按钮 insert_checkbutton(index,option)
#在指定位置插入一个功能按钮 insert_command(index,option)
#在指定位置插入一个单选按钮 insert_radiobutton(index,option)
#在指定位置插入一个分割线 insert_separator(index)
#代码手动调用一次某个选项 invoke(index)
#在窗口指定位置弹出菜单 post(x,y)
#获取某个选项的类型 type(index)
#获取某个选项距离菜单顶部的偏移量 yposition(n)
#添加一个选项 可以是功能按钮,切换按钮,单选按钮或子菜单,由类型确认 #类型可选 cascade checkbutton command radiobutton separator add(kind,option)
3.菜单按钮它是与菜单相关联的按钮,可放在任意位置,下面来创建一个看看: def show(): #触发事件 print("hello") mb = tk.Menubutton(root,text="python",relief=tk.RAISED) #菜单按钮配置 mb.pack() file = tk.Menu(mb,tearoff=0) #添加菜单 file.add_checkbutton(label="打开",command=show) #添加确认按钮到菜单中 file.add_command(label="保存",command=show) #添加保存命令 file.add_separator() #添加分隔线 file.add_command(label="退出",command=root.quit) #添加退出命令 mb.configure(menu=file) #将菜单按钮配置添加到主菜单中
4.选项菜单这个组件在一定程度上好比下拉菜单,又如listbox,下面我们来看下吧: var =tk.StringVar() var.set("编程语言") #设置菜单初始值 o = tk.OptionMenu(root,var,"python","php","c#","c++") #将菜单选项加入到菜单中去 o.pack()
是不是觉得菜单比较有趣,通过对菜单的认识你也可以做一个记事本或者其他小工具,其他方法如下: tearoff 分窗,0为在原窗,1为点击分为两个窗口,也可以是 True,False bg,fg 背景,前景 borderwidth 边框宽度 font 字体 activebackgound 点击时背景,有activeforeground,activeborderwidth,disabledforeground cursor 选中菜单选项时的光标形状 post 右键菜单 selectcolor 选中时背景 takefocus 使用 Tab 键获取按钮的焦点 title 标题 type 类型 relief tttt样式"sunken","raised","groove","ridge" "flat" 方法: m.add_cascade 添加子选项 m.add_command 添加命令(label参数为显示内容) m.add_separator 添加分隔线 m.add_checkbutton 添加确认按钮 delete 删除
十、框架又称窗口,它是在原先的基础上又创建一个窗口,一般可用于多个窗户交互,如聊天,打游戏,我们来看下: fm = tk.Frame(root) #在root上创建一个frame fm.pack() #添加进去 #在刚刚创建的frame上创建两个frame f1= tk.Frame(fm) f2= tk.Frame(fm) #添加部件 f1.pack() f2.pack()
分别给两个frame添加两个部件并且颜色不同,以便于区分 tk.Label(f1, text='标签一', bg='green').pack() tk.Button(f1, text='按钮一', bg='green').pack() tk.Label(f2, text='标签二', bg='red').pack() tk.Button(f2, text='按钮二', bg='red').pack()
我们可以简单的理解为在主窗口中放置了一个父窗口,然后这个父窗口又增添了两个子窗口,每个子窗口都创建了两个部件。这个部件在我们进行交互时还是挺有用的。
十一、弹窗,输入1.messagebox接下来我们要说的就是弹窗了,我们一般需要提示的地方都需要窗口,还有确认返回什么的,下面来看看: 要想正常使用这些功能,我们需要先引入一个模块messagebox(消息盒子),弹窗我们可以把它分为以下几种: 注意先必须导入messagebox: from tkinter import messagebox
1.提示信息messagebox.showinfo(title='提示',message='你需要这么做')
2.警告messagebox.showwarning(title='警告',message='你不能这么做')
3.错误messagebox.showerror(title='错误',message='你做错了')
前面几个都是提示弹窗,下面介绍集中与用户交互,可以让用户选择的弹窗:
4.询问选择messagebox.askquestion(title='选择',message='你是否这样做')
5.确定或取消messagebox.askokcancel(title='选择',message='你是否这样做')
6.是,否messagebox.askyesno(title='选择',message='你是否这样做')
7.重试,取消messagebox.askretrycancel(title='选择',message='你是否这样做')
若是你想把这所有的类型集中到一个函数中设置了,也有,他就是_show()函数,用法如下: messagebox._show函数的控制参数: default 消息框按钮 icon 消息框图标 message 消息框所显示的消息 parent 消息框的父组件 title 标题 type 类型
2.simpledialog为了提高用户的交互,我们需要设置一些方框供用户选择,simpledialog是你必不可少的,来看下: 导入模块: from tkinter import simpledialog
simpledialog提供三种类型输入,即字符串 整数 浮点。我们来写下: simpledialog.askinteger(title='显示',prompt='输入',initialvalue='12')
总体来说相当简单,没什么可说的。
十二、文件对话框用于打开文件对话框,选择文件或者文件夹,下面看看它有哪些用法吧: 首先我们先导入选择文件模块: from tkinter import filedialog
1.返回文件名filedialog.askopenfilename()
2.返回文件流对象filedialog.askopenfile()
3.返回多个文件流对象filedialog.askopenfiles()
4.返回多个文件名对象filedialog.askopenfilenames()
5.返回目录名filedialog.askdirectory()
6.返回文件流并创建文件filedialog.asksaveasfile()
7.返回文件名保存filedialog.asksaveasfilename()
8.打开文件对话框显示当前目录所有文件文件夹filedialog.LoadFileDialog(root).go()
9.保存文件对话框filedialog.SaveFileDialog(root).go()
十三、树型列表他就好像一棵树一样,将他的子元素包裹在里面,同样他的模块也是在ttk里面,请看: from tkinter import ttk t = ttk.Treeview(root) #加载树型控件 t.pack() n=t.insert('',0,text="hello",values=("1")) #插入一个值到控件中 n1=t.insert(n,1,text="cq",values=("2")) #插入一个属于他的子元素也就是二级元素 n2=t.insert(n,1,text="sc",values=("2")) t.insert(n1,2,text='fd',values=("3")) #插入一个属于他的三级元素 t.insert(n1,2,text='we',values=("3")) t.insert(n2,2,text='1',values=("3")) t.insert(n2,2,text='2',values=("3"))
就这样可以一直循环插入,这样就方便咱们列出大型项目的目录了,你比如说磁盘目录就可以用这个。
十四、颜色对话框选择颜色时使用,丰富的色彩可以让你处理图片画图,非常好用: from tkinter import colorchooser #导入模块 colorchooser.askcolor() #打开颜色选择对话框
十五、组件排版基本上所有的组件我们都介绍完了,相信大家通过对这章的学习应该对tkinter有了个深入的了解。 除了组件的用法之外,最重要的莫过于组件的排版了,下面我们来说一下,如何让组件放对位置。 组件有三种排列方式:pack grid place. 1.pack他是按照上下左右的方式来排列的,例如: tk.Label(root, text='1').pack(side='top')#上 tk.Label(root, text='2').pack(side='bottom')#下 tk.Label(root, text='3').pack(side='left')#左 tk.Label(root, text='4').pack(side='right')#右
而且它还可以设置组件填充方式,如: tk.Label(root, text='1').pack(fill='y') #垂直填充 tk.Label(root, text='2').pack(fill='x') #水平填充 tk.Label(root, text='3').pack(fill='both') #水平垂直填充 tk.Label(root, text='4').pack(fill='none') #不填充
2.grid它是一种网格布局,划分为几行几列的样子。所以他一般就是设置行,列。例如: tk.Label(root, text='1').grid(row=3, column=3)#第三行第三列插入一个1
还可以设置组件所跨越的行列数和内外部间隔距离: tk.Label(root, text='1').grid(row=3, column=3,rowspan=3,ipadx=6)#跨3行单元格距离6 tk.Label(root, text='2').grid(row=4, column=4,columnspa=3,pady=8)#跨3列边框距离8
3.place这是一种最简单灵活的布局,使用组件坐标来放置组件的位置。 tk.Label(root,text='43').place(x=100,y=200,width=10,height=5) #距离左边100,上边200宽高为10X5
十六、鼠标键盘事件讲完布局接着该说说最重要的东西了,绑定事件,没有这个东西组件都是没有灵魂的。我总结了以下几点: bind(sequence,func,add) bind_class(className,sequence,func,add) bind_all(sequence,func,add) 事件参数: sequence 所绑定的事件;如‘’寓意为ctrl+N键 或者 右键 func 所绑定的事件处理函数; add 可选参数,为空字符或‘+’; className 所绑定的类;
ttttt鼠标键盘事件 鼠标左键按下,2表示中键,3表示右键; 同上; 鼠标左键释放; 按住鼠标左键移动; 双击左键; 鼠标指针进入某一组件区域; 鼠标指针离开某一组件区域; 滚动滚轮; 按下A键,A可用其他键替代; 同时按下alt和A;alt可用ctrl和shift替代; 快速按两下A; 大写状态下按A; ttttt窗口事件 Activate 当组件由不可用转为可用时触发; Configure 当组件大小改变时触发; Deactivate 当组件由可用转变为不可用时触发; Destroy 当组件被销毁时触发; Expose 当组件从被遮挡状态中暴露出来时触发; Unmap 当组件由显示状态变为隐藏状态时触发; Map 当组件由隐藏状态变为显示状态时触发; FocusIn 当组件获得焦点时触发; FocusOut 当组件失去焦点时触发; Property 当窗体的属性被删除或改变时触发; Visibility 当组件变为可视状态时触发;
ttttt响应事件 event对象(def function(event)): char 按键字符,仅对键盘事件有效; keycode 按键名,仅对键盘事件有效; keysym 按键编码,仅对键盘事件有效; num 鼠标按键,仅对鼠标事件有效; type 所触发的事件类型; widget 引起事件的组件; width,heigh 组件改变后的大小,仅Configure有效; x,y 鼠标当前位置,相对于窗口; x_root,y_root 鼠标当前位置,相对于整个屏幕
好了,以上就是我学习tkinter所总结的所有知识点,可能还有部分地方未补充清楚,希望大家多多指正。
|