# GUI
# 1. Tkinter 初探
# Tkinter是事实上的Python标准GUI工具包
# 为保留tkinter的命名空间,同时减少输入量,可将重命名
import tkinter as tk
# 可调用函数mainloop()进入Tkinter主事件循环
# 要创建按钮,可实例化Button类,如果没有创建tk实例,创建控件时也将实例化tk
from tkinter import *
btn = Button()
# 要使按钮可见,需使用布局管理器(几何管理器)pack
btn.pack()
# 给控件赋值各种属性
btn['text'] = 'Click me'
# 也可以不分别给属性赋值,使用方法config同时设置多个属性
def clicked():
print('I was clicked')
btn.config(text='Click me', command=clicked)
# 还可以使用控件的构造函数来配置控件
Button(text='Click me', command=clicked).pack()
# 2. 布局
# 对控件调用方法pack时,将把控件放在其父控件(主控件)中,
# 要指定主控件,可使用构造函数的第一个可选参数,
# 如果没有指定,将把顶级主窗口用作主控件
Label(text="I'm in the first window!").pack
# Toplevel 表示除主窗口外,另一个顶级窗口
second = Toplevel()
Label(second, text="I'm in the second window!").pack
# 没有提供任何参数时,pack从窗口顶部开始将控件堆叠成一列,并让它们在窗口中水平居中
# 例如,下面的代码将生成一个又高又窄的窗口,其中包含一列按钮
for i in range(10):
Button(text=i).pack
# pack可选参数side,可设置控件停靠在哪一边(LEFT RIGHT TOP BOTTOM)
# pack可选参数fill,可设置控件在哪一个方向填满分配给它的控件(X,Y,BOTH)
# pack可选参数expand 可让控件随父控件一起增大(True)
# 其他布局管理器:grid place
# grid:可以将控件放在不可见的表格单元格中排列。为此需要指定参数row和column,
# 当控件横跨多行或多列时,还需要指定参数rowspan或columnspan
# place:可通过指定控件的x和y坐标以及高度宽度来排列
# 3. 事件处理bind
# 方法bind,要让控件对特定的事件进行处理,可对其调用方法bind
from tkinter import *
top = Tk()
def callback(event):
print(event.x, event.y)
top.bind('', callback)
# 其中是使用鼠标左按钮(按钮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('Simple Editor')
contents = ScrolledText()
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()