blog icon indicating copy to clipboard operation
blog copied to clipboard

Python之旅:第十二章-图形用户界面

Open kaindy7633 opened this issue 3 years ago • 0 comments

Table of Contents generated with DocToc

  • Python之旅:第十二章-图形用户界面/
    • 创建GUI示例程序
      • 初探
      • 布局
      • 事件处理
      • 最终程序

Python之旅:第十二章-图形用户界面/

本章将简短的介绍Python程序创建图形用户界面(GUI)的基本知识。GUI就是包含按钮、文本框等空间的窗口。Tkinter是Python标准的GUI工具包,包含在Python的标准安装中。

创建GUI示例程序

为了演示Tkinter的用法,我们将创建一个简单的GUI应用程序,这个程序是一个非常简单的文本编辑器。它主要有以下功能:

  • 让用户能打开指定的文本文件
  • 让用户能编辑文本文件
  • 让用户能保存文本文件
  • 让用户能退出程序

初探

首先,我们必须导入tkinter,为保留其命名空间,也可以对其重命名。

>>> import tkinter as tk

当然,如果你愿意,也可以导入整个模块的所有内容

>>> from tkinter import *

我们在交互式解释器上做这些工作,要创建GUI,可创建一个充当主窗口的顶级组件(控件),为此,可实例化一个TK对象。

>>> top = tk.Tk()

此时将出现一个窗口,在常规程序中,我们将调用函数mainloop以进入Tkinter主事件循环,而不是直接退出程序。

>>> mainloop()

现在我们来创建一个按钮,可直接调用实例tk中的Button方法来创建,然后使用pack方法来布局

>>> btn = tk.Button()
>>> btn.pack()

这时你应该能看到一个空白的按钮出现在GUI窗口上了,不过这个按钮还没有文本,我们来添加一个

>>> btn['text'] = 'Click me!'

同时,我们也可以给这个按钮添加行为,先定义一个函数,然后将这个函数应用到这个按钮上

def clicked():
    print('I was clicked!')

>>> btn['command'] = clicked

我们也可以使用方法config来为btn同时添加多个属性,而不是一个一个地添加

>>> btn.config(text='Click me!', command=clicked)

同时,你也可以使用控件的构造函数来配置控件的各种属性

>>> Button(text='Click me too!', commang=clicked).pack()

布局

控件调用方法pack时,将把控件放在其父控件(主控件)中,要指定主控件,可使用构造函数的第一个可选参数,如果没有指定,则会把顶级主窗口用作主控件

Label(text='I am in the first window!').pack()
second = Toplevel()
Label(second, text="I'm in the second window!").pack()

pack()方法提供多个参数来控制控件摆放的位置,比如可将参数side设置为LEFT,RIGHT,TOPBOTTOM,要让控件在xy方向上填满分配给它的空间,可将参数fill设置为xyBOTH。要让控件随父控件一起增大,可将参数expand设置为True。如果还想知道更多个选项,可以使用help查看

>>> help(Pack.config)

布局管理器除了pack,还有gridplace

事件处理

从前面的示例我们知道,可以通过设置属性command为按钮指定动作,这是一种特殊的事件处理,但Tkinter还为我们提供了更通用的事件处理机制:bind,要让控件对特定的事件进行处理,可对其调用方法bind,并指定事件的名称和要使用的函数。

>>> import tkinter as tk
>>> top = tk.Tk()
>>> def callback(event):
	    print(event.x, event.y)

>>> top.bind('<Button-1>', callback)
'4591238472callback'

最终程序

要创建单行文本框,可使用控件Entry,要创建可滚动的多行文本区域,可结合使用控件TextScrollbar,但模块tkinter.scrolledtext已提供了一种实现。要提取Entry控件的内容,可使用其方法get,对于ScrolledText对象,我们将使用其方法deleteinsert来删除文本。

本章节完毕

本系列目录:

kaindy7633 avatar Mar 08 '21 03:03 kaindy7633