参考文章http://blog.csdn.net/trochiluses/article/details/22212645
介绍:
tkinter是Python自带的GUI图形库,在我的Python3.5.2中无需手动安装
Python的还有其他的一些常用GUI库,PyGTK, PyQt, and wxPython,除此之外还有很多其他Python GUI库,而且大多都是跨平台的
使用Python库时多使用dir(),help()信息会有很大的帮助
创建并运行GUI的过程如下:
1)导入Tkinter模块
2)创建顶层串口对象top(名字不限),容纳整个GUI程序
3)在top上创建其他模块
4)将这些GUI模块与底层代码关联
5)进入主循环事件
Tkinter.Tk()返回的窗口是根窗口,一般命名是root或者top。我们可以创建多个顶层窗口(其他所有的组件都放在这个窗口之中),但是只有一个root。
组件既可以是独立的,也可以作为容器存在,作为容器的时候,他就是容器中组件的父组件。
组件会有一定的行为和动作:按钮被按下、进度条被拖动、文本框被写入,这些用户行为是“事件”,针对事件的相应动作称为“回调函数”(callback)。用户操作,产生事件,然后相应的callback执行,整个过程被称为事件驱动,很显然,我们需要定义callback函数。
界面编程的工作主要有三个:组件的创建与布局,组件间动作的关联,回调函数的处理
tkinter编程:
1、创建顶层窗口
import tkinter as tk #导入tkinter
top = tk.Tk() #添加主布局
2、在顶层窗口中添加组件
组件有:
Button:按钮,类似标签,提供额外的功能:鼠标掠过、按下、释放、键盘操作
Canvas:画布,提供绘图功能
checkbutton:选择按钮,可以选择任意个
Entry:文本框
Frame:框架,包含其他组件的纯容器
label:注意,不是lable
listbox:列表框
menu:菜单
menubutton:菜单按钮
message:消息框,可以显示多行文本
radiobuttonscale:单选按钮
scrollbar:滚动条——对其支持的组件(文本框、画布、列表框、文本区域)提供滚动功能
text:文本区域
scale:进度条
toplevel:顶级,类似框架,提供一个单独的容器。
提供给Tk支持的其他模块:
tkinter.scrolledtext
可滚动的文字部件;
tkinter.colorchooser
颜色选择对话框;
tkinter.commondialog
对话框基础类;
tkinter.filedialog
文件对话框;
tkinter.font
字体;
tkinter.messagebox
标志Tk消息对话框;
tkinter.simpledialog
基础简洁的对话框;
tkinter.dnd
tkinter拖放支持;
Turtle graphics in a Tk window.
3、组件的创建与布局
btn_left = tk.Button(top, text='hi') #创建按钮并设置父容器为top,设置按钮文字
btn_left.pack(side='left', padx=3, pady=3) #将组件打包到父容器中显示,设置显示参数
或使用
btn_left = tk.Button(top, text='hi').pack(side='left')
其中pack函数参数有(翻译可能不是很准确):
after=widget - pack it after you have packed widget;放到已经添加的组件之后
anchor=NSEW (or subset) - position widget according to
given direction;给定组件方向
before=widget - pack it before you will pack widget;放在将给组件之前
expand=bool - expand widget if parent size grows;如果父容器尺寸变大,组件也跟着变大
fill=NONE or X or Y or BOTH - fill widget if widget grows;组件变大方向
in=master - use master to contain this widget;将组件放在容器中
in_=master - see 'in' option description
ipadx=amount - add internal padding in x direction;x方向内边缘填充
ipady=amount - add internal padding in y direction;y方向内边缘填充
padx=amount - add padding in x direction;x方向外边缘填充
pady=amount - add padding in y direction;y方向外边缘填充
side=TOP or BOTTOM or LEFT or RIGHT - where to add this widget.;位置
同时,在父容器top中还能创建子容器frame,组件同样添加到子容器frame中
frame = tk.Frame(top) #创建框架容器,可以在容器内布局
sbar = tk.Scrollbar(frame).pack(side='left', fill='y')
listbox = tk.Listbox(frame, height=15, width=50).pack(side='left', fill='both')
frame.pack()
4、逻辑响应
和大多数GUI编程一样,采用callback回调编程,即事件发生后调用回调函数响应。在Qt中为产生事件信号后通知槽函数响应,需要将信号与槽绑定,在这里也是一样,需要将事件与回调函数绑定。
绑定和事件:
绑定函数能让你监听确定的事件 并且当事件发生的时候触发回调函数. The form of the bind method is:
def bind(self, sequence, func, add=''):
输入help(tk.Button.bind)可以看到
sequence 是一个字符串,表示事件。格式为<MODIFIER-MODIFIER-TYPE-DETAIL>
MODIFIER 有Control, Mod2, M2, Shift, Mod3, M3, Lock, Mod4, M4,Button1, B1, Mod5, M5 Button2, B2, Meta, M, Button3,B3, Alt, Button4, B4, Double, Button5, B5 Triple,Mod1, M1.
TYPE 有 Activate, Enter, Map,ButtonPress, Button, Expose, Motion, ButtonRelease,FocusIn, MouseWheel, Circulate, FocusOut, Property,Colormap, Gravity Reparent, Configure, KeyPress, Key,Unmap, Deactivate, KeyRelease Visibility, Destroy,Leave;
DETAIL是按键 ButtonPress,ButtonRelease 的数并且DETAIL 是 Keysym for KeyPress andKeyRelease.
例如<Control-Button-1> 是按住 Control 加 按键 “1”
func 是一个Python函数名,当事件发生时调用
add 不传参数表示此事件的这个绑定会取代其他的当前事件callback绑定,传'+'表示此绑定加入当前事件响应函数队列中
例如:
button.bind("<Enter>", button_callback)
5、完整示例
import tkinter as tk
def button_callback(event):
print("ButtonPress")
top = tk.Tk() #创建主容器
btn = tk.Button(top, text='click') #创建按钮并设置父容器为top,设置按钮文字
btn.pack(side='right') #将组件打包到父容器中显示,设置显示参数
frame = tk.Frame(top) #创建框架容器,可以在容器内布局
sbar = tk.Scrollbar(frame).pack(side='left', fill='y')
listbox = tk.Listbox(frame, height=15, width=50).pack(side='left', fill='both')
frame.pack()
btn.bind("<ButtonPress>", button_callback)
当然,以上代码只是最基本的结构。如果需要更好的响应,需要查看各个控件的属性,在回调函数中改变。
小结:GUI编程中有了想法之后,先布局即创建控件(控件可以是布局框架),根据控件属性(利用help文档)控制显示效果,绑定事件响应函数来改变控件属性完成逻辑功能。