当前位置:   article > 正文

[Python-9]GUI编程_pythongui界面编程

pythongui界面编程

一、GUI图形用户界面编程介绍

我们前面实现的都是基于控制台的程序,程序和用户的交互通过控制台来完成。

本章,我们将学习GUI(Graphics User Interface),即图形用户界面编程,我们可以通过python提供的丰富的组件,快速的实现使用图形界面和用户交互。

GUI编程类似于“搭积木”,将一个个组件(Widget)放到窗口中。如下是windows中的画图软件,就是一个典型的GUI程序:

上面的各种按钮、菜单、编辑区域等都是一个个组件,它们都放置到窗口中,并通过增加“对事件的处理”成为一个完整的程序。

1. 常用的GUI库

  1. Tkinter

    tkinter(Tk interface)是Python的标准GUI库,支持跨平台的GUI程序开发。tkinter适合小型的GUI程序编写,也特别适合初学者学习GUI编程。我们以tkinter为核心讲解。

  2. wxPython

    wxPython是比较流行的GUI库,适合大型应用程序开发,功能强于tkinter,整体设计框架类似于MFC(Microsoft Foundation Classes微软基础类库)

  3. PyQT

    Qt是一种开源的GUI库,适合大型GUI程序开发,PyQT是Qt工具包标准的Python实现。我们也可以使用Qt Desginer界面设计器快速开发GUI应用程序

2. tkinter模块

本章中,涉及大量的API讲解。学习API最好的来源就是官方提供的文档:tkinter官方网址:

Graphical User Interfaces with Tk — Python 3.7.13 documentation

或者:http://effbot.org/tkinterbook/ (相对规整,适合初学者查找)

3. GUI编程的核心步骤和第一个GUI程序

基于tkinter模块创建GUI程序包含如下4个核心步骤:

  • 创建应用程序主窗口对象(也称:根窗口),通过类Tk的无参构造函数
  1. from tkinter import *
  2. root = Tk()
  • 在主窗口中,添加各种可视化组件,比如:按钮(Button)、文本框(Label)等
  1. btn01 = Button(root)
  2. btn01["text"] = "点我就送花"
  • 通过几何布局管理器,管理组件的大小和位置
btn01.pack()
  • 事件处理:通过绑定事件处理程序,响应用户操作所触发的事件(比如:单击、双击等)

  1. def songhua(e):
  2. messagebox.showinfo("Message","送你一朵玫瑰花,请你爱上我")
  3. print("送你99朵玫瑰花")
  4. btn01.bind("",songhua)

使用tkinter模块,创建GUI应用程序,并实现点击按钮的事件处理

  1. from tkinter import *
  2. from tkinter import messagebox
  3. root = Tk() # 新建一个窗口
  4. btn01 = Button(root) # 把一个button对象放到root窗口里面
  5. btn01["text"] = "点我就送花"
  6. btn01.pack() # 调用布局管理器,把组件对象合理的放在窗口里面,pack压缩,把窗口变小了
  7. def songhua(e): # e就是事件对象
  8. messagebox.showinfo("Message", "送你一朵花")
  9. print("送你99朵玫瑰")
  10. btn01.bind("<Button-1>", songhua)
  11. root.mainloop() # 调用组件的mainloop()方法,进入事件循环

4. tkinter主窗口

主窗口位置和大小

通过geometry(‘wxh±x±y’)进行设置。w为宽度,h为高度。+x表示距屏幕左边的距离;-x表示距屏幕右边的距离;+y表示距屏幕上边的距离;-y表示距屏幕下边的距离

测试tkinter主窗口位置和大小的设置

  1. from tkinter import *
  2. root = Tk()
  3. root.title("测试主窗口的位置和大小")
  4. root.geometry("500x400+100+200") #宽度500,高度400;距屏幕左边100,距屏幕上边200
  5. root.mainloop()

二、GUI编程整体描述

图形用户界面是由一个个组件组成,就像小孩“搭积木”一样最终组成了整个界面。有的组件还能在里面再放置其他组件,我们称为“容器”。Tkinter的GUI组件关系图如下

转载自尚学堂

1. Misc和Wm:

Tkinter 的 GUI 组件有两个根父类,它们都直接继承了 object 类:

  • Misc:它是所有组件的根父类。
  • Wm:它主要提供了一些与窗口管理器通信的功能函数。

2. Tk

Misc和Wm派生出子类Tk,它代表应用程序的主窗口。一般应用程序都需要直接或间接使用Tk

3. Pack、Place、Grid

Pack、Place、Grid是布局管理器。布局管理器管理组件的:大小、位置。通过布局管理器可以将容器中的组件实现合理的排布

4. BaseWidget

BaseWidget是所有组件的父类

5. Widget

Widget是所有组件类的父类。Widget一共有四个父类:BaseWidget、Pack、Grid、Place。意味着,所有GUI组件同时具备这四个父类的属性和方法

6. 常用组件汇总列表

Tkinter类名称简介
Toplevel顶层容器类,可用于为其他组件提供单独的容器;Toplevel 有点类似于窗口
Button按钮代表按钮组件
Canvas画布提供绘图功能,包括直线、矩形、椭圆、多边形、位图等
Checkbutton复选框可供用户勾选的复选框
Entry单行输入框用户可输入内容
Frame容器用于装载其它 GUI 组件
Label标签用于显示不可编辑的文本或图标
LabelFrame容器也是容器组件,类似于Frame,但它支持添加标题
Listbox列表框列出多个选项,供用户选择
Menu菜单菜单组件
Menubutton菜单按钮用来包含菜单的按钮(包括下拉式、层叠式等)
OptionMenu菜单按钮Menubutton 的子类,也代表菜单按钮,可通过按钮打开一个菜单
Message消息框类似于标签,但可以显示多行文本;后来当 Label 也能显示多行文本之后,该组件基本处于废弃状态
PanedWindow分区窗口该容器会被划分成多个区域,每添加一个组件占一个区域,用户可通过拖动分隔线来改变各区域的大小
Radiobutton单选钮可供用户点边的单选钮
Scale滑动条拖动滑块可设定起始值和结束值,可显示当前位置的精确值
Spinbox微调选择器用户可通过该组件的向上、向下箭头选择不同的值
Scrollbar滚动条用于为组件(文本域、画布、列表框、文本框)提供滚动功能
Text多行文本框显示多行文本

三、GUI应用程序类的经典写法

本节程序也是GUI应用程序编写的一个主要结构,采用了面向对象的方式,更加合理的组织代码。

通过类Application组织整个GUI程序,类Application继承了Frame及通过继承拥有了父类的特性。通过构造函数__init__()初始化窗口中的对象,通过createWidgets()方法创建窗口中的对象

Frame框架是一个tkinter组件,表示一个矩形的区域Frame一般作为容器使用,可以放置其他组件,从而实现复杂的布局。

标准的GUI程序类的写法

  1. """
  2. 测试一个经典的GUI程序
  3. 使用面向对象的方式
  4. """
  5. from tkinter import *
  6. from tkinter import messagebox
  7. class Application(Frame):
  8. """
  9. 一个经典的GUI程序的类的写法
  10. """
  11. def __init__(self, master=None): # 构造器:用来构造组件对象
  12. super().__init__(master)
  13. self.master = master
  14. self.pack()
  15. self.createWidge()
  16. def createWidge(self): # 如果有很多个组件,可以单独定义一个方法
  17. """
  18. 创建新的组件
  19. """
  20. self.btn01 = Button(self)
  21. self.btn01["text"] = "点击送花"
  22. self.btn01.pack() # 通过布局管理器显示
  23. self.btn01["command"] = self.songhua # 加事件
  24. # 创建一个退出按钮
  25. self.btnQuit = Button(self, text="退出", command=root.destroy)
  26. self.btnQuit.pack()
  27. def songhua(self):
  28. messagebox.showinfo("送花", "送你99朵玫瑰花")
  29. if __name__ == '__main__':
  30. root = Tk() # 创建一个根窗口对象
  31. root.geometry("400x100+200+300")
  32. root.title("一个经典的GUI程序类的测试")
  33. app = Application(master=root)
  34. root.mainloop()

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/198179
推荐阅读
相关标签
  

闽ICP备14008679号