Python3学习第十二章 图形用户界面

#!usr/bin/env python  
# -*- coding:utf-8 _*-
""" 
@author:AIvision 
@file: lecture12.py 
@time: 2023/09/05 
"""
# 第十二章 图形用户界面
# 12.1 创建 GUI 示例应用程序
# 为演示Tkinter的用法,我将介绍如何创建一个简单的GUI应用程序。你的任务是编写一个简
# 单的程序,让用户能够编辑文本文件。这里并非要开发功能齐备的文本编辑器,而只想提供基本
# 的功能。毕竟这里的目标是演示基本的Python GUI编程机制。
# 这个微型文本编辑器的需求如下。
#  让用户能够打开指定的文本文件。
#  让用户能够编辑文本文件。
#  让用户能够保存文本文件。
#  让用户能够退出。
# 编写GUI程序时,绘制其用户界面草图通常很有帮助。图12-1显示了一个可满足前述文本编
# 辑器需求的简单布局。

# 12.1.1 初探
# 首先,必须导入tkinter。为保留其命名空间,同时减少输入量,可能需要将其重命名。
# import tkinter as tk
# 然而,如果你愿意,也可导入这个模块的所有内容。这不会有太大的害处。
# >>> from tkinter import *
# 我们将使用交互式解释器来做些初探工作。
# 要创建GUI,可创建一个将充当主窗口的顶级组件(控件)。为此,可实例化一个Tk对象。
# >>> top = Tk()
# 此时将出现一个窗口。在常规程序中,我们将调用函数mainloop以进入Tkinter主事件循环,
# 而不是直接退出程序。在交互式解释器中,不需要这样做,但你完全可以试一试。
# >>> mainloop()
# 解释器像是挂起了,而GUI还在运行。为了继续,请退出GUI并重启解释器。
# 有很多可用的控件,它们的名称各异。例如,要创建按钮,可实例化Button类。如果没有Tk
# 实例,创建控件也将实例化Tk,因此可不先实例化Tk,而直接创建控件。
# >>> from tkinter import *
# >>> btn = Button()
# 现在这个按钮是不可见的——你需要使用布局管理器(也叫几何体管理器)来告诉Tkinter
# 将它放在什么地方。我们将使用管理器pack——在最简单的情况下只需调用方法pack即可。
# >>> btn.pack()
# 控件包含各种属性,我们可以使用它们来修改控件的外观和行为。可像访问字典项一样访问
# 属性,因此要给按钮指定一些文本,只需使用一条赋值语句即可。
# >>> btn['text'] = 'Click me!'
# 至此,应该有一个类似于下面的窗口:

# # import tkinter as tk
# # 导入这个模块的所有内容
# from tkinter import *
# # 要创建GUI,可创建一个将充当主窗口的顶级组件(控件)。为此,可实例化一个Tk对象。
# top = Tk()
# # 调用函数mainloop以进入Tkinter主事件循环
# mainloop()
#
# btn = Button()
# # 现在这个按钮是不可见的——你需要使用布局管理器(也叫几何体管理器)来告诉Tkinter
# # 将它放在什么地方。我们将使用管理器pack
# btn.pack()
# # 控件包含各种属性,我们可以使用它们来修改控件的外观和行为。可像访问字典项一样访问
# # 属性,因此要给按钮指定一些文本,只需使用一条赋值语句即可。
# btn['text'] = 'Click me!'



# 给按钮添加行为也非常简单。
# >>> def clicked():
# ... print('I was clicked!')
# ...
# >>> btn['command'] = clicked
# 现在如果单击这个按钮,将看到指定的消息被打印出来。
# 可以不分别给属性赋值,而使用方法config同时设置多个属性。
# >>> btn.config(text='Click me!', command=clicked)
# 还可使用控件的构造函数来配置控件。
# >>> Button(text='Click me too!', command=clicked).pack()

# 12.1.2 布局
# 对控件调用方法pack时,将把控件放在其父控件(主控件)中。要指定主控件,可使用构造
# 函数的第一个可选参数;如果没有指定,将把顶级主窗口用作主控件,如下面的代码片段所示:
# Label(text="I'm in the first window!").pack()
# second = Toplevel()
# Label(second, text="I'm in the second window!").pack()
# Toplevel类表示除主窗口外的另一个顶级窗口,而Label就是文本标签。
# 没有提供任何参数时,pack从窗口顶部开始将控件堆叠成一列,并让它们在窗口中水平居中。
# 例如,下面的代码生成一个又高又窄的窗口,其中包含一列按钮:
# for i in range(10):
#  Button(text=i).pack()
# 所幸可调整控件的位置和拉伸方式。要指定将控件停靠在哪一条边上,可将参数side设置为
# LEFT、RIGHT、TOP或BOTTOM。要让控件在x或y方向上填满分配给它的空间,可将参数fill设置为X、
# Y或BOTH。要让控件随父控件(这里是窗口)一起增大,可将参数expand设置为True。还有其他的
# 选项,如指定锚点和内边距的选项,但这里不会使用它们。要快速了解可用的选项,可执行如下
# 命令:
# >>> help(Pack.config)
# 还有其他的布局管理器,具体地说是grid和place,它们可能更能满足你的需求。与pack布局
# 管理器一样,要使用它们,可对控件调用方法grid和place。为避免麻烦,在一个容器(如窗口)
# 中应只使用一种布局管理器。
# 方法grid让你能够这样排列控件:将它们放在不可见的表格单元格中。为此需要指定参数row
# 和column,还可能要指定参数rowspan或columnspan——如果控件横跨多行或多列。方法place让
# 你能够手工放置控件——通过指定控件的x和y坐标以及高度和宽度来做到。这在大多数情况下都
# 是馊主意,但偶尔可能需要这样做。这两个几何体管理器都还有其他的参数,要详细了解,可使
# 用如下命令:
# >>> help(Grid.configure)
# >>> help(Place.config)

# from tkinter import *
#
# Label(text="I'm in the first window!").pack()
# second = Toplevel()
# Label(second, text="I'm in the second window!").pack()
#
# # 调用函数mainloop以进入Tkinter主事件循环
# mainloop()
#
# for i in range(2):
#     Button(text=i).pack()

# 12.1.3 事件处理
# 你知道,可通过设置属性command给按钮指定动作(action)。这是一种特殊的事件处理,但
# Tkinter还提供了更通用的事件处理机制:方法bind。要让控件对特定的事件进行处理,可对其调
# 用方法bind,并指定事件的名称和要使用的函数。下面是一个示例:
# >>> from tkinter import *
# >>> top = Tk()
# >>> def callback(event):
# ... print(event.x, event.y)
# ...
# >>> top.bind('', callback)
# '4322424456callback'
# 其中是使用鼠标左按钮(按钮1)单击的事件名称。我们将这种事件关联到函数
# callback。这样,每当用户在窗口top中单击时,都将调用这个函数。向函数callback传递一个event
# 对象,这个对象包含的属性随事件类型而异。例如,对于鼠标单击事件,它提供了x和y坐标,在
# 这个示例中将它们打印出来了。还有很多其他类型的事件,完整的清单可使用下面的命令来获取:
# >>> help(Tk.bind)
# 要获悉更详细的信息,可参阅前面提到的资源。

# 12.1.4 最终的程序
# 至此,我们大致具备了编写前述程序所需的知识,但还需获悉用于创建小型文本框和大型文
# 本区域的控件的名称。通过快速浏览文档可知,要创建单行文本框,可使用控件Entry。要创建
# 可滚动的多行文本区域,可结合使用控件Text和Scrollbar,但模块tkinter.scrolledtext已经提
# 供了一种实现。要提取Entry控件的内容,可使用其方法get。对于ScrolledText对象,我们将使
# 用其方法delete和insert来删除文本。调用方法delete和insert时,需要使用合适的参数来指定
# 文本的位置;在这里,我们将使用'1.0'来指定第1行的第0个字符(即第一个字符前面),使用END
# 来指定文本末尾,并使用INSERT来指定当前插入点。最终的程序如代码清单12-1和图12-2所示。


# 代码清单12-1 简单的GUI文本编辑器
from tkinter import *
from tkinter.scrolledtext import ScrolledText

def load():
    with open(filename.get()) as file:
        contents.delete('1.0', END)
        contents.insert(INSERT, file.read())

def save():
    with open(filename.get(), 'w') as file:
        file.write(contents.get('1.0', END))

top = Tk()
top.title("Simple Editor")
contents = ScrolledText()

# 要让控件随父控件(这里是窗口)一起增大,可将参数expand设置为True;
# 所幸可调整控件的位置和拉伸方式。要指定将控件停靠在哪一条边上,可将参数side设置为LEFT、RIGHT、TOP或BOTTOM
# 要让控件在x或y方向上填满分配给它的空间,可将参数fill设置为X、Y或BOTH。
contents.pack(side=BOTTOM, expand=True, fill=BOTH)
filename = Entry()
filename.pack(side=LEFT, expand=True, fill=X)
Button(text='Open', command=load).pack(side=LEFT)
Button(text='Save', command=save).pack(side=LEFT)
# 调用函数mainloop以进入Tkinter主事件循环
mainloop()


# 你可按如下步骤来尝试使用这个文本编辑器。
# (1) 运行这个程序,你将看到一个类似于图12-2的窗口。
# (2) 在大型文本区域中输入一些内容,如Hello, world!。
# (3) 在小型文本框中输入一个文件名,如hello.txt。请确保指定的文件不存在,否则原有文件
# 将被覆盖掉。
# (4) 单击Save按钮。
# (5) 退出程序。
# (6) 再次启动程序。
# (7) 在小型文本框中输入刚才输入的文件名。
# (8) 单击Open按钮,这个文件包含的文本将出现在大型文本区域中。
# (9) 随心所欲地编辑这个文件,再保存它。

# 12.2 使用其他 GUI 工具包
# 大部分GUI工具包的基本要素都大致相同,但遗憾的是,当你学习使用新包时,必须花时间
# 了解让你能够实现目标的细节。因此,你应花时间来决定使用哪个包(如参阅标准库参考手册中
# 介绍其他GUI包的部分),再深入研究其文档并着手开始编写代码。但愿本章介绍的基本概念让
# 你能够理解这些文档。

# 12.3 小结
# 同样,下面来复习一下本章介绍的内容。
#  图形用户界面(GUI):GUI有助于让应用程序对用户更友好。并非所有的程序都需要GUI,
# 但只要程序需要与用户交互,GUI就可能很有帮助。
#  Tkinter:Tkinter是一个跨平台的Python GUI工具包,成熟而且使用广泛。
# 布局:通过指定组件的几何属性,很容易对其进行定位,但要确保它们在父窗口的大小
# 发生变化时做出正确的反应,就必须使用布局管理器。
#  事件处理:GUI工具包中用户触发事件执行的操作。要发挥作用,程序可能需要响应某些
# 事件,否则用户将无法与之交互。在Tkinter中,要给组件添加事件处理程序,可使用方
# 法bind。

Python3学习第十二章 图形用户界面_第1张图片

你可能感兴趣的:(学习,python,开发语言)