概述
tkinter之旅(第一部分)主要介绍组件及相关内容:
- Toplevel和Tk组件
- Message和Entry组件
- Checkbutton、Rodiobutton和Scale组件
- 图像:PhotoImage和BitmapImage对象
- 组件和窗口配置选项
- 对话框(标准与自定义)
- 低级别事件绑定
- tkinter链接变量对象
- 使用用于其他图形类型和操作的Python图形库(PIL)扩展
一、配置组件外观
- 颜色:bg选项设置背景颜色;fg设置显示文本颜色,支持英文(如:"blue")或十六进制字符串(如:"#ff0000");
- 大小:设置高度、宽度 字体:font,三元组(字体系列、大小、类型);
- 字体系列(如:Times、Courier、Helvetica等);
- 大小即数字;
- 类型:normal(正常)、hold(粗体)、romam(罗马)、italc(斜体)、underline(下划线)、overstrike(加粗)另,还可以组合,
- 如holditalc(加粗斜体)
-
布局、扩展:pack的时候expand(YES)、fill(BOTH、X、Y)选项会实现组件的扩展和拉伸
from tkinter import *
root =Tk()
labelfont = ('times',20,'bold')#字体系列、大小、类型
widget = Label(root,text="Hello config world!")
widget.config(bg='black',fg='yellow')#标签背景黑色,文本颜色黄色
widget.config(font=labelfont)#使用更大的字体
widget.config(height=3,width=20)#初始化大小:行间距、字符间距
widget.pack(expand=YES,fill=BOTH)
root.mainloop()
tkinter的其它自定义外观的方法:
- 边框和浮凸:一个'bd=N'组件选项可用于设置边框宽度,而relief=S选项能够指定一种边框类型,S可以FLAT(扁平)、SUNKEN(凹陷)、RAISED(凸起)、GROOVE(凹槽)、SOLID(加粗)、RIDGE(脊状)
- 光标:cursor选项能够改变鼠标经过组件的鼠标形状;cursor='gumby'将鼠标指针变为Gumby图形、还有:watch(手表)、pencil(铅笔)、crdss(十字)、hand2(手形2)
- 状态:一些组件同时也支持状态属性。状态属性会影响外观。如:state=DISABLED(禁用),禁用时组件置灰。NORMAL(正常)、READONLY(只读)
- 留白:很多组件(按钮、标签、文本)周围都可添加额外空间。通过padx=N、pady=N来实现。
#自定义设置组件外观
from tkinter import *
root=Tk()
root.config(bg='red')
widget = Button(root,text='Ithing',padx=10,pady=10)#组件与文本的留白
widget.pack(padx=40,pady=20)#组件与程序顶层组件留白
widget.config(cursor='gumby')#鼠标
widget.config(bd=8,relief=RAISED)#边框宽度、类型
widget.config(bg='dark green',fg='white')#组件背景、字体颜色
widget.config(font=("helvetica",20,'underline italic'))#italc(斜体)、underline(下划线)
root.mainloop()
二、顶层窗口
1.Tk()或默认根窗口与Toplevel组件异同
2.顶层窗口协议
拦截关闭:protocol;WM_DELETE_WINDOW是弹窗关闭按钮的标识;
关闭所有窗口:quit;根窗口的按钮会运行quit方法,结束程序。
窗口标题:title
窗口图标:iconbitmap
几何管理:顶层窗口是其他组件的容器,很像一个独立的Frame.,顶层窗口组件自身永远不会被封装;
三.对话框
对话框:模态对话框、非模态对话框
模态对话框:会阻止其他界面,直到对话框被关闭;要想程序继续运行,用户必须对对话框做出回应。
非模态对话框:可以永久停留在屏幕上,不干扰界面中其他窗口,这种对话框常常可以随时接受输入。
1.标准(通用)对话框
下面3段代码,过程:C段代码import A段代码(一个quit关闭类)、B段代码(提供:按钮名称、tkinter标准对话框作为回调函数)实现一个启动栏弹窗。主要了解:tkinter中标准对话框(ask系列(askopenfilename、askcolor、askquestion、askfloat)show系列、)
A代码:
#md6_quitter
'''
验证退出请求的quit按钮;复用、连接其他GUI的实例,并按照需求重新封装
'''
from tkinter import *
from tkinter.messagebox import askokcancel #获取封装的标准对话框
class Quitter(Frame):
def __init__(self,parent=None):
Frame.__init__(self,parent)
self.pack()
widget = Button(self,text='Quit',command=self.quit)
widget.pack(side=LEFT,expand=YES,fill=BOTH)
def quit(self):
ans = askokcancel('Verify exit',"Really quit?")
if ans:Frame.quit(self)
B代码:
#md7_对话框演示启动栏
#定义一个回调演示表
from tkinter.filedialog import askopenfilename#获取标准对话框
from tkinter.colorchooser import askcolor#Lib/tkinter中
from tkinter.messagebox import askquestion,showerror
from tkinter.simpledialog import askfloat
demos = {
'Open':askopenfilename,
'Color':askcolor,
'Query':lambda :askquestion('Warning','You typed "rm *"\nConfirm?'),
'Error':lambda :showerror('Error!','He is dead,jim'),
'Input':lambda :askfloat('Entry','Enter credit card number')
}
C代码:
'''
创建一个简单的按钮栏,弹出对话框演示
'''
from tkinter import *
from md7_对话框演示启动栏 import demos#按钮回调处理程序
from md6_quitter import Quitter#增加一个退出对象
print(demos.items())
class Demo(Frame):
def __init__(self,parent=None,**opthons):
Frame.__init__(self,parent,**opthons)
self.pack()
Label(self,text='Basic demos').pack()
for(key,value) in demos.items():
Button(self,text=key,command=value).pack(side=TOP,fill=BOTH)
Quitter(self).pack(side=TOP,fill=BOTH)
if __name__ == '__main__':
Demo().mainloop()
结果:运行后,每一个按钮都会有对应结果,弹窗对应模态对话框
2.获取对话框结果并打印;使用lamdba函数传递回调函数;
知识点:模态对话框会返回用户操作值;
3.askcolor()的返回值
from tkinter import *
from tkinter.colorchooser import askcolor
def setBgColor():
(triple,hexstr) = askcolor()#获取选择颜色并返回,如:((0.0, 255.99609375, 64.25), '#00ff40')
if hexstr:
print(hexstr)
push.config(bg=hexstr)
root=Tk()
push = Button(root,text='Set Background Color',command=setBgColor)
push.config(height=3,font=('times',20,'bold'))
push.pack(expand=YES,fill=BOTH)
root.mainloop()
4、自定义对话框
focus_set()、grab_set()、wait_window()是创建模态对话框的关键函数。
focus_set:使得窗口接管应用程序的输入焦点
grab_set:禁用应用程序中的所有其他窗口
wait_window:暂停调用,直到这个弹出框本身被销毁。当窗口被destory方法所销毁时,grab会自动释放禁用其他窗口……