目录
- 一.创建GUI示例应用程序
- 1.初探
- 2.布局
- 3.事件处理
- 4.最终程序
一.创建GUI示例应用程序
一个微型的文本编辑器有四个需求:
1.让用户能够打开指定的文本文件
2.让用户能够编辑文本文件
3.让用户能够保存文本文件
4.让用户能够退出。
1.初探
首先要导入tinter。为保留命名空间的同时减少输入量,可能需要将其重命名。
>>>import tkinter as tk
也可以导入该模块的所有内容
>>>from tkinter import *
要创建GUI,先创建一个将充当主窗口的控件。为此,可以实例化一个Tk对象。
>>>top=Tk()
这时会出现一个窗口,在常规程序中,我们将调用函数mainloop来进入Tkinter主事件循环。在交互式解释器中并不需要这样做。
要创建按钮,可以实例化Button类。若没有Tk实例,创建控件也将实例化Tk,所以可直接创建控件,先不实例化Tk
>>>from tkinter import *
>>>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()
2.布局
对控件调用方法pack时,会把控件放在主控件中。要指定主控件,可使用构造函数的第一个可选参数;若没有指定,将把顶级主窗口用作主控件。
Label(text="I'm in the first window!").pack()
second=Toplevel()
Label(second,text="I'm in the first window!").pack()
Toplevel类表示除主窗口外的另一个顶级窗口,而Label就是文本标签。
不提供任何参数时,pack从窗口顶部将控件堆叠成一列,并让它们在窗口中水平居中。所幸可以调整控件的位置和拉伸方式。要指定将控件停靠在哪一条边上,可以将参数side设置为LEFT、RIGHT、TOP、BOTTOM。要让控件在x或y方向上填满分配给它的空间,可以将参数fill设置为x,y,BOTH。要让控件随父控件(窗口)一起增大,可以将参数expand设置为True。
要了解可用的选项,可执行如下命令:
>>>help(Pack.config)
grid和place也是布局管理器。
方法grid让你能够这样排列控件:将它们放在不可见的表格单元格中。为此需要指定参数row和column,也有可能需要指定参数rowspan或columnspan——控件横跨多列或多行的情况下。
方法place可以让你手动放置控件——通过指定控件的x和y坐标以及高度、宽度来做到。
3.事件处理
通过设置属性command赋予按钮指定动作,这就是一种事件处理,一种特殊的事件处理。
Tkinter提供了通用的事件处理机制——方法bind
处理特定的事件,在调用方法bird时,要同时指定事件的名称和要使用的函数。
示例:
>>>from tkinter import *
>>>top=TK()
>>>def callback(event):
... print(event.x,event.y)
...
>>>top.bind('<Button-1>',callback)
'4322424456callback'
<Button-1>
是使用鼠标左按钮单击的事件名称。我们将这种事件关联到函数callback。这样,每次用户在窗口top单击时,都将调用这个函数。向函数callback传递一个event对象。对象包含的属性随事件类型而异。
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("Simple Editor")
''
>>>contents=ScrolledText()
>>>contents.pack(side=BOTTOM,expand=True,fill=BOTH)
>>>filename=Entry()
>>>filename.pack(side=LEET,expand=True,fill=X)
>>>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()
#运行结果