Python图形用户界GUI大解密(上篇)

开发 后端
这篇文章着重介绍了Python中自带的GUI模块-----tkinter,由于内容较多,上篇内容主要介绍了其安装、基本部件、下拉菜单、画布等内容。

[[402883]]

在我们平时写代码的时候,为了让程序效果显得更直观,我们通常都会给它们套上一层美丽的外衣,这层外衣便是-------GUI,中文名又叫,图形用户接口,能起到很好的交互作用。下面我们来着重介绍下Python中自带的GUI模块-----tkinter,看看它有哪些丰富的图形接口吧。

1.安装并导入

哦,tkinter库系统自带,无需安装,直接导入即可:

  1. import tkinter  as tk  # 因为它比较长,所以给它个简写的方式 ,用tk代表它。 

2.实例化窗口

  1. root= tk.Tk()            #主窗口 
  2. root.title('hello')   #窗口标题 
  3. root.geometry('400x500')  #窗口尺寸 
  4. root.wm_minsize(140, 170) # 设置窗口最小化大小 
  5. root.wm_maxsize(1440, 2800)             # 设置窗口最大化大小 
  6. root.iconbitmap('1.ico')   #窗口图标 必须是ico格式的图片 
  7. root.resizable(width=False, height=True)     # 设置窗口宽度不可变,高度可变 
  8. root.mainloop() #主窗口循环显示 

 

我们的第一个窗口就这样应运而生了,另外它还有许多其它功能,比如:

  1. root.quit()    #退出 
  2. root.destroy() #销毁 
  3. root.update() #刷新 可以接收用户改变程序进程 
  4. root.update_idletasks()  #刷新 不能接收用户改变程序进程 
  5. root.wm_title('i love you')  #最小化显示字样 
  6. root.configure(background='blue') #背景颜色 

下面我们再给它添加点别的部件和功能吧。

3.基本部件

tkinter里面有很多丰富的部件,有标签,文本框,列表框,下拉列表框,多选框,单选框等等,下面我们一起认识下它们吧。

一、标签

它是tkinter里面的标签部件,主要用于提示。那么它有哪些有趣的功能呢?一起看一下:

  1. label=tk.Label(root,   
  2.          text='Hello', #标签内文本 
  3.          bg='red',      #背景颜色 
  4.          font=('Arial',20), #字体和字体大小 
  5.          width=10,  #文本宽度 
  6.          height=5   #文本高度 
  7.         ) 

不过我们光这样标签还不会添加到我们的主界面中,还得给它进行下一步操作:

  1. label.pack() #添加部件到主界面 

下面看下效果:

这样我们就成功将它添加进来了,有点丑,等会我们再做修改。大家可以看到现在的标签里的值是静态无法修改的,那要是我们想让它动态变更了,那我们可以这样做:

这样就达到了修改标签的值的功能。

关于标签还有许多优秀的方法,比如说:

  1. label.configure(text) #重新设置标签文本 得是text的时候设置才生效 
  2. label.configure(background='blue')  #重新设置标签背景 

标签的属性总共有下面几种:

  1. anchor              文本位置; 
  2. background(bg)     背景色; 
  3.     foreground(fg)      前景色; 
  4.     borderwidth(bd)     边框宽度; 
  5.     width             标签宽度; 
  6.     height            标签高度; 
  7.     bitmap             标签中的位图; 
  8.     font               字体; 
  9.     image             标签中的图片; 
  10.     justify            多行文本的对齐方式; 
  11.     text             标签中的文本,可以使用'\n'表示换行 
  12.     textvariable       显示文本自动更新,与StringVar等配合着用 

二、按钮

按钮的功能主要是实现点击功能,比如说确认,提交操作。那么它有哪些操作呢?

可以看出,成功实现了点击事件,而且我们可以通过点击按钮来改变标签的值,下面来看看:

可以看出,成功的改变了值和背景颜色。大家可能对上图中的side='left'有点不理解,其实那个就是确定组件位置的,一个左一个右。按钮还有一个隐藏和显示的功能也是相当好实现的:

  1. button.pack          #显示 
  2. button.pack_forget   #隐藏 

关于button还有以下方法供大家学习:

  1. anchor           文本位置; 
  2. background(bg)     按钮的背景色; 
  3.   bitmap:            按钮上显示的位图; 
  4.   borderwidth(bd)    按钮边框的宽度; 
  5.   command:         按钮消息的回调函数; 
  6.   cursor:           鼠标移动到按钮上的指针样式; 
  7.   font:              按钮上文本的字体; 
  8.   foreground(fg)     按钮的前景色; 
  9.   height:           按钮的高度; 
  10.   image:            按钮上显示的图片; 
  11.   state:             按钮的状态(disabled); 
  12.   text:               按钮上显示的文本; 
  13.   width:            按钮的宽度 
  14.   padx              设置文本与按钮边框x的距离,还有pady; 
  15.   activeforeground    按下时前景色 
  16.   textvariable        可变文本,与StringVar等配合着用 

三、文本框,多行文本框

之所以拿来一起讲,是因为它们很多参数都是一样的,所以没必要分开讲,我们先来说说文本框:

1.文本框

用来接受用户输入,常用来登陆账号和密码。

可以看到一个显示为汉字,另一个则是?,这就是它的明文和密文设置了。我们还可以获取到它里面的值用来校验数据库中的信息以便登陆,不过这里我们只把它打印出来即可。

完美将它打印了出来,小伙伴们看到这里是不是可以写个登陆系统嘞。单行文本框自定义插入值:

  1. e1.insert(index,string) #在指定索引位置插入字符串 

2.多行文本框

与文本框不同的是,它可以显示多行信息,一般用来显示某些结果。

可以看到,多行文本就是这样的,我们可以给它插入文本:

  1. tt.insert('insert','你是猪吗')  #首行插入 
  2. tt.insert('current','我是猪')   #当前插入 
  3. tt.insert('end','123')         #末尾插入 

 

除了插入还可以删除:

  1. tt.delete('1.0',tk.END) #删除文本框所有内容 

另外文本框有时候需要实时更新内容,所以还有一个方法:

  1. tt.update()  #更新多行文本框内容 

 

除此之外,我们还可以在多行文本框中添加其它组件实现一些功能。

1.记住密码功能

2.照片查看器

我们需要认识一个新的方法,它叫PhotoImage。它的设计比较古怪,个人觉得,因为它只支持gif图片。

通过上面的设置创建了一个window执行函数,在实际应用中可以用它来实现记住密码和查看gif照片的功能。

关于文本框和多行文本框就说到这里,它们还有很多其它的方法:

指定位置插入值:

  1. tt.mark_set("here","3.2") #建立mark,相当于索引,第三行第二列 
  2. tt.insert('here',"hello") #插入hello 
  3. tt.mark_unset('here') #删除mark 

高亮显示文本:

  1. tt.tag_add('tag1','1.3','2.1','2.2') #设置要设置样式的区域 
  2. tt.tag_config("tag1",background="green",foreground="blue"
  3. tt.tag_config("tag2",background="blue",foreground="red")#如设置多个样式则新样式覆盖旧样式 
  4. tt.tag_lower("tag1")  #可通过tagraise()和tag_lower()方法来提高和降低某个Tag的优先级 

获取多行文本框的值:

  1. tt.get('0.0','end'

文本绑定鼠标事件:

  1. tt.tag_add("link","2.1","2.5"
  2. tt.tag_config("link",foreground="blue",underline=True) #选中的内容添加下划线 蓝色背景颜色 
  3. def show_1(event): 
  4.      tt.config(cursor="arrow") #鼠标箭头型 
  5. def show_2(event): 
  6.      tt.config(cursor="xterm")  #鼠标I型 
  7. def click(event): 
  8.      print('我被单击了'
  9. tt.tag_bind("link","<Enter>",show_1) 
  10. tt.tag_bind("link","<Leave>",show_2) 
  11. tt.tag_bind("link","<Button-1>",click) 

 

恢复,撤销:

  1. tt.edit_undo() #撤销 
  2. tt.editredo()  #恢复 

更多精彩内容:

  1. background(bg)      文本框背景色; 
  2. foreground(fg)        前景色; 
  3. selectbackground    选定文本背景色; 
  4. selectforeground    选定文本前景色; 
  5. borderwidth(bd)      文本框边框宽度; 
  6. font                 字体; 
  7. show                文本框显示的字符,若为*,表示文本框为密码框; 
  8. state               状态; 
  9. width              文本框宽度 
  10. textvariable        可变文本,与StringVar等配合着用 

四、单选框,复选框

这个我们平时勾选答案是单选还是多选时很常见。下面让我们来看看吧:

1.单选框Radiobutton

2.复选框Checkbutton

可以看出,做出来了,不过有点复杂,因为没有善用循环,下面给出一种简单的写法:

可以看到,几行代码就把四个控件列出来了。关于单选框多选框还有很多有趣的方法:

  1. anchor           文本位置; 
  2. background(bg)   背景色; 
  3. foreground(fg)    前景色; 
  4. borderwidth       边框宽度; 
  5. width            组件的宽度; 
  6. height           组件高度; 
  7. bitmap           组件中的位图; 
  8. image            组件中的图片; 
  9. font             字体; 
  10. justify          组件中多行文本的对齐方式; 
  11. text             指定组件的文本; 
  12. value            指定组件被选中中关联变量的值; 
  13. variable          指定组件所关联的变量; 
  14. indicatoron        特殊控制参数,当为0时,组件会被绘制成按钮形式; 
  15. textvariable       可变文本显示,与StringVar等配合着用 

五、listbox列表

列表常用于选择选项。

这个比较简单,没什么好说的。

六、滑块条,滚动条

1.滑块条

一行代码就能搞定了,也是非常简单:

默认方向为垂直,只需将orient属性设为horizontal(tk.HORIZONTAL )即可,也可设为垂直:orient="vertical"

2.滚动条

常和其它组件配套使用,比如列表框,多行文本框。安装滚动条之前需要做两件事情。

1.指定该组件的yscrollbarcommand参数为Scrollbar的set()方法

2.指定Scrollbar 的 command 参数为该组件的 yview() 方法

由于滚动条一般都是垂直方向,所以我们不改动它的方向。

可以看到,我们的滚动条和列表组件产生了联系,滚动条滚动列表内容相应往下翻,如果你要想设置滚动条的位置,只需:

  1. sl.set(0.5,1) #使滚动条始终保持在中间位置 

滚动条和滑块条一样,都比较简单,项目中用的也不是蛮多,总体来说比较简单的组件。

七、画布

平时会用于绘制各种曲线和位图,canvas可以很轻松创建各种有趣的图形图像。下面来了解下

  1. #初始化一个200x100的背景颜色为蓝色的形状 
  2. canvas = tk.Canvas(root, bg='blue', height=100, width=200)  
  3.  
  4. #创建一个矩形,背景色为绿色,边框线颜色为红色,线宽为2,虚线长度为3,画刷为gray12, 
  5. jx=canvas.create_rectangle(100,100,50,50,fill='green',outline='red',width=2,dash=3,stipple = 'gray12'
  6.  
  7. #绘制弧形 风格为pieslice(chord扇形,抛物线arc) 起始角度0 角度偏移量180 
  8. hx=canvas.create_arc(50, 100,140, 200,style='pieslice',start=0, extent=180) 
  9.  
  10. #创建直线 坐标为100,100的长度为200x200的直线,一头有箭头(none无,last尾部,both两端,箭头形状) 
  11. zx=canvas.create_line(100, 100, 200, 200,arrow='first',arrowshape='30 20 10')  
  12.  
  13. #创建椭圆,背景色为red 
  14. y=canvas.create_oval(50, 100,140, 200, fill='red'
  15.  
  16. #创建多边形 直角三角形 
  17. dbx=canvas.create_polygon((150,150,150,200,70,200),fill = 'red'
  18.  
  19. #创建文字  居中显示 
  20. wz=canvas.create_text((10,10),text = 'Hello Text',anchor ='w'
  21. canvas.select_from(wz,3)  # 设置文本的选中开始位置 
  22. canvas.select_to(wz,7)# 设置文本的选中结束位置 
  23.  
  24. #创建位图,类型为error(info信息,question问题,hourglass沙漏) 
  25. canvas.create_bitmap((40,40),bitmap = 'error'
  26.  
  27. #创建gif 
  28. img= tk.PhotoImage(file='1.gif'
  29. canvas.create_image(10, 10, anchor='nw', image=img) 
  30.  
  31. #创建组件 
  32. bt =tk.Button(canvas,text='hello',command) 
  33. canvas.create_window((100,100),window=bt,anchor='w'
  34.  
  35. #将jx移动到另一区域 
  36. cv.coords(jx,(10,10,20,20)) 
  37.  
  38. #移动图形右移20个px,再返回 
  39. canvas.move(jx,20,0) 
  40.  
  41. #删除图形 
  42. canvas.delete(jx) 
  43.  
  44. #添加绑定事件,只有点击到矩形边框才有效 
  45. canvas.tag_bind('jx','<Button-1>',command) #左键为1,右键为3,滚轮2 

canvas绘图还是比较强大的,以上的知识点差不多够平时用了,可以看到:

八、下拉列表框

一般用于某个功能的配套选择,这个部件在tkinter中的ttk模块下,和其它的不同,所以我们导入ttk:

  1. #打印下拉列表框的值 
  2. from tkinter import  ttk 
  3. def function(*arg): 
  4.     print(cb.get()) #获取下拉列表框的值 
  5. cb=ttk.Combobox(root, width=12,state='readonly')#下拉列表框宽度为12 只读 
  6. cb['values'] = ('请选择-----','1','2','3','4') #设置下拉列表框的内容    
  7. cb.current(0)    #将当前选择状态置为0,也就是第一项 
  8. cb.bind("<<ComboboxSelected>>",function)  #绑定function函数,然后触发事件 
  9. cb.pack() 

注:下拉列表没有command参数,但是它可以设置textvariable进行参数传递。

九、菜单栏,菜单按钮,选项菜单

先说说我们熟知的菜单(Menu),它主要我们为了简化软件的使用而建立的,避免添加过多的控件。那么它是如何建立的了,请看:

1.下拉菜单

  1. #创建菜单栏 
  2. m=tk.Menu(root) 
  3.  
  4. #定义一个父菜单 
  5. file=tk.Menu(m,tearoff=False
  6.  
  7. #将上面定义的父菜单命名为File,放在菜单栏中 
  8. m.add_cascade(label='文件', menu=file) 
  9.  
  10. #在File中加入下拉菜单,并添加对应命令操作。 
  11. #如果点击这些选项, 就会触发相应的功能 
  12. file.add_command(label='新建',accelerator='Ctrl+N'
  13. file.add_command(label='打开', accelerator='Ctrl+O'
  14. file.add_command(label='保存', accelerator='Ctrl+S'
  15.  
  16. #添加一条分割线 
  17. file.add_separator() 
  18. file.add_command(label='退出',command=root.quit,accelerator='Ctrl+Q'
  19.   
  20.   
  21. edit= tk.Menu(m,tearoff=False
  22. m.add_cascade(label='编辑', menu=edit) 
  23. edit.add_command(label='剪切',accelerator='Ctrl+X'
  24. edit.add_command(label='复制',accelerator='Ctrl+C'
  25. edit.add_command(label='粘贴',accelerator='Ctrl+V'
  26.   
  27. #二级菜单 
  28. s= tk.Menu(file,tearoff=False
  29. file.add_cascade(label='导入', menu=s) 
  30. s.add_command(label="模块"
  31. s.add_command(label="文本文件"
  32.  
  33. #三级菜单 
  34. z=tk.Menu(s,tearoff=False
  35. s.add_cascade(label='图片',menu=z) 
  36. z.add_command(label="gif"
  37. z.add_command(label="jpg"
  38. z.add_command(label="png"
  39. z.add_command(label="bmp"
  40. root.configure(menu=m) 

 

2.右键弹出菜单

在做这个之前我们要了解鼠标绑定事件爱你,因为右键弹出需要击键,所以我们需要了解它。

既然是右键我们当然得绑定右键了:

  1. root.bind("<Button-3>",function

然后我们书写绑定函数并把它绑定到当前对象中:

  1. def function(event): 
  2.     m.post(event.x_root, event.y_root)  #可以替换菜单,变为其它菜单,比如说s,z 

这样就实现了右键弹出菜单的功能,是不是很简单了。关于菜单的操作还有许多,不一一演示,下面请看:

  1. #添加一个子菜单 coption为配置选项 
  2. add_cascade(option
  3.  
  4. #添加一个切换按钮 coption为配置选项 
  5. add_checkbutton(option
  6.  
  7. #添加一个功能按钮 coption为配置选项 
  8. add_command(option
  9.  
  10. #添加一个单选按钮 coption为配置选项 
  11. add_radiobutton(option
  12.  
  13. #添加一个分割线 
  14. add_separator() 
  15.  
  16. #删除index1 到 index2之间的选项 
  17. delete(index1,index2) 
  18.  
  19. #获取菜单某一项的属性值 
  20. entrycget(index,coption) 
  21.  
  22. #重新配置菜单中某项的属性 
  23. entryconfigure(index,option
  24.  
  25. #返回参数位置对应的选项索引 
  26. index(i) 
  27.  
  28. #在指定位置插入一个子菜单 
  29. insert_cascade(index,option
  30.  
  31. #在指定位置插入一个切换按钮 
  32. insert_checkbutton(index,option
  33.  
  34. #在指定位置插入一个功能按钮 
  35. insert_command(index,option
  36.  
  37. #在指定位置插入一个单选按钮 
  38. insert_radiobutton(index,option
  39.  
  40. #在指定位置插入一个分割线 
  41. insert_separator(index
  42.  
  43. #代码手动调用一次某个选项 
  44. invoke(index
  45.  
  46. #在窗口指定位置弹出菜单 
  47. post(x,y) 
  48.  
  49. #获取某个选项的类型 
  50. type(index
  51.  
  52. #获取某个选项距离菜单顶部的偏移量 
  53. yposition(n) 
  54.  
  55. #添加一个选项 可以是功能按钮,切换按钮,单选按钮或子菜单,由类型确认 
  56. #类型可选 cascade checkbutton command radiobutton separator 
  57. add(kind,option

3.菜单按钮

它是与菜单相关联的按钮,可放在任意位置,下面来创建一个看看:

  1. def show(): #触发事件 
  2.     print("hello"
  3. mb = tk.Menubutton(root,text="python",relief=tk.RAISED) #菜单按钮配置 
  4. mb.pack() 
  5. file = tk.Menu(mb,tearoff=0)  #添加菜单 
  6. file.add_checkbutton(label="打开",command=show) #添加确认按钮到菜单中 
  7. file.add_command(label="保存",command=show) #添加保存命令 
  8. file.add_separator() #添加分隔线 
  9. file.add_command(label="退出",command=root.quit) #添加退出命令 
  10. mb.configure(menu=file)  #将菜单按钮配置添加到主菜单中 

 

4.选项菜单

这个组件在一定程度上好比下拉菜单,又如listbox,下面我们来看下吧:

  1. var =tk.StringVar() 
  2. var.set("编程语言") #设置菜单初始值 
  3. o = tk.OptionMenu(root,var,"python","php","c#","c++") #将菜单选项加入到菜单中去 
  4. o.pack() 

 

是不是觉得菜单比较有趣,通过对菜单的认识你也可以做一个记事本或者其它小工具,其它方法如下:

  1. tearoff         分窗,0为在原窗,1为点击分为两个窗口,也可以是 TrueFalse 
  2. bg,fg           背景,前景 
  3. borderwidth      边框宽度 
  4. font              字体 
  5. activebackgound  点击时背景,有activeforeground,activeborderwidth,disabledforeground 
  6. cursor            选中菜单选项时的光标形状 
  7. post               右键菜单 
  8. selectcolor      选中时背景 
  9. takefocus         使用 Tab 键获取按钮的焦点  
  10. title              标题 
  11. type                类型 
  12. relief              样式"sunken""raised""groove""ridge" "flat" 
  13.  
  14. 方法: 
  15. m.add_cascade      添加子选项 
  16. m.add_command      添加命令(label参数为显示内容) 
  17. m.add_separator    添加分隔线 
  18. m.add_checkbutton  添加确认按钮 
  19. delete                删除 

总结

这篇文章着重介绍了Python中自带的GUI模块-----tkinter,由于内容较多,上篇内容主要介绍了其安装、基本部件、下拉菜单、画布等内容,下篇文章我们继续解密Python GUI的其他内容。

 

责任编辑:姜华 来源: Python爬虫与数据挖掘
相关推荐

2021-06-04 09:01:05

PythonGUI大解密Python基础

2012-02-01 08:56:32

2016-07-12 10:09:13

OpenManage大

2016-06-20 15:36:01

OpenManage大

2017-12-14 09:35:10

58速运订单调度

2023-11-29 07:30:08

Python用户界面

2022-01-26 00:02:00

PythonGUI界面

2017-11-22 12:40:02

PythonGUI框架

2021-06-27 17:12:27

PythonGUI图形界面

2009-03-10 08:43:38

Erwise图形浏览器

2021-01-04 09:19:06

WindowsLinuxGUI程序

2009-06-10 18:18:43

Java GUI用户界面

2010-06-17 16:06:18

串口协议

2011-01-18 17:47:35

2010-09-07 12:06:46

PPPoE协议

2012-05-03 08:44:31

2011-05-17 13:35:01

身份认证校园网

2010-01-15 10:39:32

Firefox 4.0图形用户界面

2019-05-07 15:39:54

Mongodb GUI工具数据库

2019-05-06 16:15:36

Mongodb GUI管理数据库
点赞
收藏

51CTO技术栈公众号