Python 升级之路( Lv18 ) GUI 编程

开发
今天我们将初步学习 GUI 图形界面编程 tkinter,了解常用组件并编写简单程序。

栖息于阿拉德大陆上空的海洋——天空之海的巨大生物。据说它的体积甚至超过周边的大陆,每次它飞行的时候,就像看到一块巨大的陆地在移动。有传闻说,天帷巨兽每300年会穿过天空之海降落到大陆上休息。  

在天帷巨兽的背部形成的岛屿上,残留着大量不知年代的文明遗迹。探索家莱斯利•贝伊兰斯发现之后,被深深的吸引。从那以后,他开始乘坐天帷巨兽到处周游世界,并且还在巨兽的背上创建了GBK教。

常用的GUI库

  • Tkinter tkinter(Tk interface) 是 Python 的标准 GUI 库,支持跨平台的 GUI 程序开发. tkinter 适合小型的 GUI 程序编写,也特别适合初学者学习 GUI 编程. 本章以 tkinter 为核心来进行学习
  • wxPythonwxPython 是比较流行的 GUI 库,适合大型应用程序开发,功能强于 tkinter,整体设计 框架类似于 MFC(Microsoft Foundation Classes 微软基础类库)
  • PyQT Qt 是一种开源的 GUI 库,适合大型 GUI 程序开发,PyQT 是 Qt 工具包标准的 Python 实现.  我们也可以使用 Qt Desginer 界面设计器快速开发 GUI 应用程序

tkinter 模块

本章中,涉及大量的 API 讲解。学习 API 最好的来源就是官方提供的文档:tkinter 官网 传送门tkinter 中文文档  传送门tkinter 菜鸟教程 传送门

程序开发步骤

(1)) 创建应用程序主窗口对象(也称:根窗口)

# import tkinter
from tkinter import *
root = Tk()

ps: 我们可以通过 from tkinter import * 来手动导入所有 tkinter 所有包, 也可以先不导包, 然后在提示需要导包导包时 Alt+ 回车 后选择第一条提示自动导包即可。

(2) 在主窗口中,添加各种可视化组件

btn01 = Button(root)
btn01["text"] = "点击进行抽奖"

(3) 通过几何布局管理器,管理组件的大小和位置

btn01.pack()

(4) 事件处理(通过绑定事件处理程序,响应用户操作所触发的事件)

def lottery(e):     # 4.1 通过绑定事件处理程序,响应用户操作所触发的事件(比如:单击、双击等)
    messagebox.showinfo("Message", "恭喜您中奖了, 奖励您500万")
    print("有用户中奖, 奖金500万")


btn01.bind("<Button-1>", lottery)

第一个 GUI 程序

基于以上步骤, 来实现一个简单的抽奖应用。

步骤:

  • 通过类 Tk 的无参构造函数
  • 在主窗口中,添加各种可视化组件
  • 通过几何布局管理器,管理组件的大小和位置
  • 通过绑定事件处理程序,响应用户操作所触发的事件
  • 调用组件方法, 进入事件循环

实操代码:

from tkinter import Tk, Button, messagebox

root = Tk()     # 1. 通过类 Tk 的无参构造函数

btn01 = Button(root)    # 2. 在主窗口中,添加各种可视化组件,比如:按钮(Button)、文本框(Label)等
btn01["text"] = "点击进行抽奖"
btn01.pack()        # 3. 通过几何布局管理器,管理组件的大小和位置


def lottery(e):     # 4.1 通过绑定事件处理程序,响应用户操作所触发的事件(比如:单击、双击等)
    messagebox.showinfo("Message", "恭喜您中奖了, 奖励您500万")
    print("有用户中奖, 奖金500万")


btn01.bind("<Button-1>", lottery)
root.mainloop()     # 4.2 调用组件方法, 进入事件循环

结果展示:

tkinter 主窗口

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

from tkinter import * root = Tk()

root.title("测试主窗口的位置和大小")
root.geometry("500x400+100+200") # 宽度 500,高度 400;距屏幕左边 100,距屏幕上边 200
root.mainloop()

GUI 编程整体描述

tkinter 中 GUI 组件的继承关系图图下图所示:

这些类的基本作用如下:

  • Misc 和 Wm:Tkinter 的 GUI 组件有两个根父类,它们都直接继承了 object 类:Misc:它是所有组件的根父类:   Wm:它主要提供了一些与窗口管理器通信的功能函数
  • TkMisc 和 Wm 派生出子类 Tk,它代表应用程序的主窗口. 一般应用程序都需要直接或间接 使用 Tk
  • Pack、Place、GridPack、Place、Grid 是布局管理器.  布局管理器管理组件的大小、位置通过布局管理器可以将容器中的组件实现合理的排布
  • BaseWidgetBaseWidget 是所有组件的父类
  • WidgetWidget 是所有组件类的父类. Widget 一共有四个父类:BaseWidget、Pack、Grid、Place. 这意味着,所有 GUI 组件同时具备这四个父类的属性和方法

常用组件汇总列表

图片

GUI 应用程序类的经典写法

通过类 Application 组织整个 GUI 程序,类 Application 继承了 Frame 及通过继承拥有 了父类的特性. 通过构造函数__init__()初始化窗口中的对象,通过 createWidgets()方法创建窗口中的对象.Frame 框架是一个 tkinter 组件,表示一个矩形的区域. Frame 一般作为容器使用,可以放置其他组件,从而实现复杂的布局。

实操代码:

"""测试一个经典的 GUI 程序的写法,使用面向对象的方式"""
import random
from tkinter import *
from tkinter import messagebox


class Application(Frame):
    def __init__(self, master=None):
        super().__init__(master)  # super 代表的是父类的定义, 而不是父类对象
        self.master = master
        self.pack()
        self.createWidget()

    def createWidget(self):
        """创建组件"""
        self.btn01 = Button(self)
        self.btn01["text"] = "点击抽奖"
        self.btn01.pack()
        self.btn01["command"] = self.lottery

        """创建一个退出按钮"""
        self.btnexit = Button(self, text="退出", command=root.destroy)
        self.btnexit.pack()

    def lottery(self):
        messagebox.showinfo("点击抽奖", "恭喜您中奖, 奖金{0}个粽子+{1}个咸鸭蛋".format(random.randint(1, 100), random.randint(1, 100)))


if __name__ == "__main__":
    root = Tk()
    root.geometry("400x100+810+330")
    root.title("GUI应用程序经典写法")
    app = Application(master=root)
    root.mainloop()

结果展示

在格兰之森时, 冒险家了不起遭遇到了燃烧的森林(烈焰格拉卡)和变成僵尸的精灵(暗黑雷鸣废墟)等异变. 在前往天 空之城攻略怪物时, 遇到了GSC , 在机缘巧合下帮助莉莉安和卡卡坤互相了解对方的心意, 在平时在冒险家酒馆时还结实了老板索菲亚. 击败领主塞格哈特之后,在赛格哈特驻地的正上方,天帷巨兽正好飞过,而乘坐飞艇成功逃生的红发少女却因为飞艇被破坏,被迫迫降在天空之城,受伤昏迷,随后被冒险家了不起带回赫顿玛尔的医疗所负责救治。  

在苏醒后, 红发少女介绍其自己的来历: 她叫奥菲利亚, 是GBK教的一名成员. 由于所属组织的很多人疑似收到了控制, 导致性情大变. 开始残害同胞. 在知道了不起身份之后, 也请求了不起前去帮忙调查下情况. 于是在修理匠森纳斯的帮助下, 修复飞艇之后的了不起便和奥菲利亚以及鬼剑士GSC一起去调查事件的起因了...

责任编辑:赵宁宁 来源: Python技术
相关推荐

2024-12-23 14:54:47

2019-03-19 13:44:41

Python编程技巧编程语言

2022-02-24 10:05:20

Python编程语言代码

2019-10-24 09:29:13

编程Python程序

2015-07-28 17:11:00

编程技术提升

2012-12-28 13:35:37

网络无线网络

2024-06-13 10:24:28

2021-12-27 14:33:47

Python语言开发

2023-11-27 19:42:56

Python GUI编程

2023-11-30 15:02:34

Python

2009-09-08 14:30:57

CCNA认证考试

2016-10-31 20:13:41

大数据数据分析

2024-03-26 15:35:51

iOS 18苹果

2024-04-28 09:28:49

2009-06-10 18:18:43

Java GUI用户界面

2019-07-23 18:15:26

技术大数据数据库

2023-05-09 08:24:13

PythonTkinterGUI编程

2009-03-10 10:49:28

2023-07-31 22:02:17

客服订单详情

2022-03-24 12:28:03

React 17React 18React
点赞
收藏

51CTO技术栈公众号