目录
图形用户界面的构成
一个顶层窗口(也称根窗口、主窗口)
通过类Tk的无参构造函数,可以创建应用程序主窗口
1.通过类Tk的2无参构造函数创建应用程序主窗口(也称根窗口、顶层窗口)
2.在应用程序主窗口中添加各种的可视化组件
3.调用组件的方法
4.绑定事件处理程序
创建GUI程序
在创建图形用户界面时,如果使用Tkinter,那么就需要导入tkinter库,另外还需要单独导入tkinter库中的messagebox子模块来进行弹出消息处理。
导入模块后第一步是创建一个根窗口组件root,第二步是创建按钮组件或其他可视化组件。
然后通过调用组件的方法以达到显示按钮文本或添加属性等信息的功能。
第四步:使用pack或place或者是grid几何布局管理器调整窗口和组件的位置。
最后调用组件的mainloop方法进入事件循环。
e.g.
from tkinter import * # 导入tkinter模块所有内容
from tkinter import messagebox # 导入tkinter模块中的子模块messagebox
root = Tk() # 创建1个Tk根窗口组件root
btnSayHi = Button(root) # 创建1个按钮组件btnSayHi,作为root的子组件
btnSayHi["text"] = "Hello" # 设置btnSayHi的text属性
btnSayHi.pack() # 调用组件的pack方法,调整其显示位置和大小
def sayHi(e): # 定义事件处理程序
messagebox.showinfo("Message", "Hello, world!") # 弹出消息框
btnSayHi.bind("<Button-1>", sayHi) # 绑定事件处理程序,鼠标左键
root.mainloop() # 调用组件的mainloop方法,进入事件循环
程序运行结果:
Frame 框架和GUI应用程序类
框架是tkinter的组件之一,用来表示屏幕上的一块矩形区域。在框架中还可以包含其他组件,以实现更为复杂的窗口布局。
e.g.
通过框架创建GUI程序,设计hello按钮和quit按钮
在程序中是创建根窗口组件后将根组件传递给了类参数,然后创建一个类的实例,调用实例的mainloop方法进入事件循环
创建quit按钮组件时,选项中command选项等于root.destroy,这里是调用了销毁方法实现了GUI程序的退出
import tkinter as tk #导入tkinter模块
from tkinter import messagebox #导入tkinter模块中的子模块messagebox
class Application(tk.Frame): #定义GUI应用程序类,派生于Frame类
def __init__(self, master=None): #构造函数,master为父窗口
tk.Frame.__init__(self, master) #调用父类的构造函数
self.pack() #调用组件的pack方法,调整其显示位置和大小
self.createWidgets() #调用对象方法,创建子组件
def createWidgets(self): #对象方法:创建子组件
self.btnSayHi = tk.Button(self) #创建按钮组件btnSayHi
self.btnSayHi["text"] = "Hello" #设置显示文本属性
self.btnSayHi["command"] = self.sayHi #设置命令属性,绑定事件处理程序
self.btnSayHi.pack() #调用组件的pack方法,调整其显示位置和大小
#创建按钮组件btnQuit,其显示文本为"Quit",命令事件处理程序为root.destroy
self.btnQuit = tk.Button(self, text="Quit", command=root.destroy)
self.btnQuit.pack() #调用组件的pack方法,调整其显示位置和大小
def sayHi(self): #定义事件处理程序
tk.messagebox.showinfo("Message","Hello, world!") #弹出消息框
root = tk.Tk() #创建一个Tk根窗口组件root
app = Application(master=root) #创建Application的对象实例
app.mainloop() #调用组件的mainloop方法,进入事件循环
运行结果:
主窗口的位置和大小的调整
通过类Tk的无参构造函数可以创建应用程序主窗口。通过字典键可以设置窗口的属性
调整窗口大小
1.通过字典键
root['width'] = 400
root['height'] = 500
2.调用geometry()函数
root.geometry('wxh+-x+-y)
+x为窗口左边距屏幕左边的距离,-x相反;+y为窗口上边距屏幕上方的距离,-y相反
几何布局管理器
几何布局管理器有三种:pack、grid和place
pack几何布局管理器
pack()方法提供的选项
e.g.
通过 pack()方法设计登陆界面
from tkinter import * # 导入tkinter模块所有内容
root = Tk()
root.title("登录") # 窗口标题
f1 = Frame(root)
f1.pack() # 界面分为上下三个Frame,f1放置第一行标签和文本框
f2 = Frame(root)
f2.pack() # f2放置第二行标签和文本框
f3 = Frame(root)
f3.pack() # f3放置第三行二个按钮
Label(f1, text="用户名").pack(side=LEFT) # 标签放置在f1中,左停靠
Entry(f1).pack(side=LEFT) # 单行文本框放置在f1中,左停靠
Label(f2, text="密 码").pack(side=LEFT) # 标签放置在f2中,左停靠
Entry(f2, show="*").pack(side=LEFT) # 单行文本框放置在f2中,左停靠
Button(f3, text="登录").pack(side=RIGHT) # 按钮放置在f3中,右停靠
Button(f3, text="取消").pack(side=RIGHT) # 按钮放置在f3中,右停靠
root.mainloop() # 调用组件的mainloop方法,进入事件循环
其中,Label方法用来设置标签,如:用户名、密码。
Entry方法用来添加文本框
grid几何布局管理器
grid几何布局管理器采用的是表格结构。组件位置由行和列决定。
grid()方法提供的选项:
e.g.
通过grid()方法设计keyboard界面
from tkinter import * # 导入tkinter模块所有内容
root = Tk()
Button(root, text="1").grid(row=0, column=0) # 按钮1放置于0行0列
Button(root, text="2").grid(row=0, column=1) # 按钮2放置于0行1列
Button(root, text="3").grid(row=0, column=2) # 按钮3放置于0行2列
Button(root, text="4").grid(row=1, column=0) # 按钮4放置于1行0列
Button(root, text="5").grid(row=1, column=1) # 按钮5放置于1行1列
Button(root, text="6").grid(row=1, column=2) # 按钮6放置于1行2列
Button(root, text="7").grid(row=2, column=0) # 按钮7放置于2行0列
Button(root, text="8").grid(row=2, column=1) # 按钮8放置于2行1列
Button(root, text="9").grid(row=2, column=2) # 按钮9放置于2行2列
Button(root, text="0").grid(row=3, column=0, columnspan=2, sticky=E + W) # 跨两列,左右贴紧
Button(root, text=".").grid(row=3, column=2, sticky=E + W) # 左右贴紧
root.mainloop() # 调用组件的mainloop方法,进入事件循环
运行结果:
place几何布局管理
place几何布局管理是通过具体坐标实现队组件的控制的,它能够精确地控制组件的大小
place()方法提供的选项:
e.g.
通过place()方法设计登陆界面:
from tkinter import * # 导入tkinter模块所有内容
root = Tk();
root.title("登录") # 窗口标题
root['width'] = 200;
root['height'] = 80 # 窗口宽度、高度
Label(root, text="用户名", width=6).place(x=1, y=1) # 用户名标签,绝对坐标(1,1)
Entry(root, width=20).place(x=45, y=1) # 用户名文本框,绝对坐标(45,1)
Label(root, text="密 码", width=6).place(x=1, y=20) # 密码标签,绝对坐标(1,20)
Entry(root, width=20, show="*").place(x=45, y=20) # 密码文本框,绝对坐标(45,20)
Button(root, text="登录", width=8).place(x=40, y=40) # 登录按钮,绝对坐标(40,40)
Button(root, text="取消", width=8).place(x=110, y=40) # 取消按钮,绝对坐标(110,40)
root.mainloop() # 调用组件的mainloop方法,进入事件循环
程序运行结果:
事件处理
事件绑定
1.创建组件对象实例时指定:
创建组件对象实例时,可以通过其命名参数command指定事件处理函数。
2.实例绑定:
调用组件对象实例方法bind,可以为指定组件实例绑定事件,方法如下:
w.bind("<event>", eventhandler, add='')
3.类绑定:
调用组件对象实例方法bind_class函数,可以为特定组件类绑定事件:
w.bind_class("Widget", "<event>", eventhandler, add='')
4.程序界面绑定:
调用组件对象实例方法bind_all函数,可以为所有组件类绑定事件:
w.bind_all("<event>", eventhandler, add='')
事件处理函数
事件处理可以定义为函数,也可以定义为对象的方法。两者都带一个参数event。
通过传递的Event事件对象的属性可以获取各种相关参数