第十二章 图形用户界面

12.1 创建 GUI 示例应用程序

编写一个简 单的程序,让用户能够编辑文本文件

这个微型文本编辑器的需求如下。

1、 让用户能够打开指定的文本文件。

2、 让用户能够编辑文本文件。

3、 让用户能够保存文本文件。

4、让用户能够退出。

编写GUI程序时,绘制其用户界面草图通常很有帮助。图12-1显示了一个可满足前述文本编 辑器需求的简单布局。

这些界面元素的用法如下。  在按钮左边的文本框中输入文件名,再单击Open按钮打开这个文件,它包含的文本将出 现在底部的文本框中。  在底部的大型文本框中,你可随心所欲地编辑文本。  要保存所做的修改,可单击Save按钮,这将把大型文本框的内容写入到顶部文本框指定 的文件中。  没有Quit(退出)按钮,用户只能使用默认Tkinter菜单中的Quit命令来退出程序。

12.1.1 初探

首先,必须导入tkinter。为保留其命名空间,同时减少输入量,可能需要将其重命名。

import tkinter as tk

要创建GUI,可创建一个将充当主窗口的顶级组件(控件)。为此,可实例化一个Tk对象。

import tkinter as tk

top=tk.Tk()

top.mainloop()      #调用函数mainloop以进入Tkinter主事件循环

此时将出现一个窗口如下:。

python 使用with open打开读取文件 python的with open_控件

图12-2

添加按钮:

btn=tk.Button(top)

现在这个按钮是不可见的——你需要使用布局管理器(也叫几何体管理器)来告诉Tkinter 将它放在什么地方。

python 使用with open打开读取文件 python的with open_编程 _02


图12-3

控件包含各种属性,我们可以使用它们来修改控件的外观和行为。

btn['text']="点击我"


图12-4

给按钮添加行为也非常简单。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
import tkinter as tk

top = tk.Tk()                              #创建主窗口
top.title("第一个窗口")                    #主窗口标题
top.geometry('500x200')                    #设置主窗口大小
lab = tk.Label(top, text='')               #添加标签
lab.pack()
btn = tk.Button(top)                       #添加按钮
btn.pack()
btn['text'] = "这是按钮"                   #给btn按钮text属性赋值


def click():                               #定义事件函数
    lab['text'] = "那是谁呀,按了按钮就没下文了?"


btn['command'] = click                      #给btn按钮绑定事件

top.mainloop()


图12-4

12.1.2 布局

对控件调用方法pack时,将把控件放在其父控件(主控件)中。主窗口本身是一个Toplevel,也可以在主窗口外添加额外的窗口,可以把不同功能的控件分到不同窗口上,也可以用来当弹窗使用。像其它button、label这类的小控件,在创建时总需要传入一个窗口。

second = tk.Toplevel(top)


图12-6

给副窗口添加属性,并包含一个标签。

second = tk.Toplevel(top)
second.title("副窗口")
sublab=tk.Label(second )
sublab.pack()
sublab['text']="这是一个在副窗口中的标签。"


图12-7

(可能由于版本的不同,书中的一些代码不能实现,所以只能这样了。有些参数设定可以参见nkd50000 的博客小白学tkinter(常用参数大总结)。

12.1.3 事件处理

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

import tkinter as tk
top = tk.Tk()                       #创建一个窗口
def callback(event):                #定义事件
    print(event.x, event.y)         #获取鼠标左键点击的坐标,打印输出。

top.bind('<Button-1>', callback)    #绑定事件,<Button-1>是使用鼠标左按钮(按钮1)单击的事件名称。
top.mainloop()

事件的完整的清单可使用下面的命令来获取:

import tkinter as tk
help(tk.Tk.bind)

12.1.4 最终的程序

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("简单文本编辑器")
contents = ScrolledText()
contents.pack(side=BOTTOM, expand=True, fill=BOTH)
filename = Entry()
filename.pack(side=LEFT, expand=True, fill=X)
Button(text='打开', command=load).pack(side=LEFT)
Button(text='保存', command=save).pack(side=LEFT)
mainloop()

python 使用with open打开读取文件 python的with open_编程 _03


图12-8

保存之后,会产生一个你好文件:

python 使用with open打开读取文件 python的with open_自学_04


图12-9

12.2 使用其他 GUI 工具包

python除内置的TkinterGUI包之外,还有很多的第三方GUI供选择,但每个包的功能虽然大同小异,其使用时的函数、参数及函数调用方法不尽相同,因此初学PythonGUI一要选对包,二要看参考手册甚至源代码等资料,三要勤奋。