栖息于阿拉德大陆上空的海洋——天空之海的巨大生物。据说它的体积甚至超过周边的大陆,每次它飞行的时候,就像看到一块巨大的陆地在移动。有传闻说,天帷巨兽每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一起去调查事件的起因了...