tkinter 快速入门
1 程序框架
import tkinter as tk # 框架--面向过程 root_window =tk.Tk() # 1.创建应用程序主窗口对象(也称根窗口) btn = Button(root_window) # 2.添加各种可视化组件 btn.pack() # 3.通过布局管理器,管理组件的大小和位置 btn.bind(<Button-1>,func) # 4.通过绑定事件处理程序,响应用户操作(func为定义的回调函数) root_window.mainloop() # 开启主循环,让窗口处于显示状态
import tkinter as tk # 框架--面向对象 class Application(tk.Frame): # Frame是组件之一,矩形区域,可以作为别的组件的容器 def __init__(self, master=None): super().__init__(master) self.master = master self.pack() self.create_widget() def create_widget(self): # 创建别的组件 self.btn = Button(self) # 参数self指的是Frame对象自己,作为按钮的父窗口 pass if __name__ == '__main__': win = tk.Tk() win.geometry(400x300) frame = Application(master=win) win.mainloop()
2 窗口重要属性
win.title(string=Test) # win.config(bg='black') # 设置窗口背景 win.lift() # 设置窗口弹出时置顶 win.geometry(350x250+0+0) # 设置窗口大小及显示位置 win.resizable(False, False) # 禁止用户调整窗口大小 win.protocol('WM_DELETE_WINDOW', callback) # 窗体的通信协议方法,关闭按钮触发消息 win.overrideredirect(True) # 隐藏标题栏 最大化最小化按钮和关闭按钮 # win.attributes(-toolwindow, 2) # 去掉窗口最大化最小化按钮,只保留关闭 win.attributes(-topmost, True) # 设置tkinter窗口置顶显示 win.after(2000, config_) #窗口创建后一定时间执行程序 第一个参数是时间,单位是毫秒;第二个参数是要执行的程序,注意,不用加括号 # win.attributes('-fullscreen', True) # 窗口全屏 # win.after(4000, win.destroy) # 窗口创建4秒后关闭窗口
3 控件共同属性
设置控件属性的三种方式:
- 创建对象时,使用命名参数(也叫关键字参数), btn = Button(self, fg=red)
- 创建对象后, 使用字典索引方式, btn[fg] = red (重载了魔法函数setitem)
- 创建对象后, 使用config()方法, btn.config(fg = red)
- anchor 定义控件或者文字信息在窗口内的位置
- bg fg font 背景颜色 字体的颜色(black, white) (字体,大小,字体样式)(黑体, 30)
- bitmap image 定义显示在控件内的位图文件 图片文件(gif).
- cursor 移动到控件上时,定义鼠标指针的类型
- height width padx/pady 控件的高度 / 控件的宽度(字符或者像素) 控件内的文字或者图片与控件边框之间的水平/垂直距离(像素)
- relief borderwidth 边框样式(solid) 边框宽度
- command 该参数用于执行事件函数
- text justify 定义控件的标题文字 多行文字的排列方式(right left center)
- state 控制控件是否处于可用状态(normal disabled)
4 布局管理器
pack是按添加顺序排列组件 grid是按行/列形式排列组件 place允许程序员指定组件的大小和位置
- pack
1、pack函数布局的时候,默认先使用的放到上面,然后依次向下排列,默认方式它会给我们的组件一个自认为合适的位置和大小。
2、side参数,指定了它停靠在哪个方向,可以为LEFT,TOP,RIGHT,BOTTOM,分别代表左,上,右,下,
fill参数可以是X,Y,BOTH,NONE即在水平方向填充,竖直方向填充,水平和竖直方向填充和不填充。
当side=left或side=right时,fill=x不起作用,只能填充y. side=“top”,side=bottom时,fill=y不起作用,只能填充x.
3、它的expand参数可以是YES 和 NO(将容器放置在剩余空闲位置上的中央(包括水平和垂直方向)),它的anchor参数可以是n, s, w, e ,nw, ne, sw, se, center(这里的NESW分别表示北东南西),在控制每一个容器在每一行的位置比较有用. n或者tk.N等价.
4、ipadx/ipady 表示容器内的内容和容器边框之间的距离,padx/pady表示容器和别的容器或者边框之间的间距.
- grid
- column row columnspan rowspan 小部件网格化的列号(0开始) 行号(0开始) 合并几个列 合并几个行
- ipadx/ipady ,padx/pady 同上
- sticky 此选项确定如何在单元格内分配小部件未以其自然大小占用的任何额外空间,默认居中.
sticky=tk.N+tk.S
垂直拉伸小部件但保持水平居中。
- place
- x y 部件放置的绝对坐标
- relx, rely 部件放置的相对坐标(0-1之间的小数), 0 最左边或者最上边, 1最右边或者最下边
- height width 部件高度 宽度
- anchor n, ne, e, se, s, sw, w, nw, or center 设置控件锚点的位置, 即显示在x,y的n方向一边
5 控件例子代码
# 文本框 self.label01 = tk.Label(self,text=北京\n上海,width=10,heigh=2,bg=blue,fg=white,font=(黑体,30)) # 按钮 self.btn = tk.Button(self, text=登录, command=self.login, state=tk.DISABLED) # state=disabled # 单行输入框 s = tk.StringVar # tk.IntVar() tk.StringVar() tk.DoubleVar() tk.BooleanVar() s.set(sun wen ping) # 取值 s.get() self.entry01 = tk.Entry(self, textvariable=s) # 控件取值 entry01.get(), 但是控件没有set方法.密码 show=* # 多行文本框 self.text1 = tk.Text(self, width=40, height=12) # 40字符宽,12行高 self.text1.insert(1.0, 123\nsun) # 1.0表示左上角(行从1开始,列从0开始,如果行列的位置大于已有的内容,同tk.END),还可以用 tk.END,tk.INSERT表示位置, tk.END 表示结束位置, tk.INSERT表示当前鼠标位置 s = self.text1.get(1.2, 1.6) # 取值, 所有文本 get(1.0, tk.END) self.text1.delete(1.0, tk.END) # 删除全部文本 self.text1.tag_add(good, 1.0, 1.6) # 增加一个标记,命名为good self.text1.tag_config(good, background=red) # 设置标记的背景色 self.text1.tag_bind(good, <Button-1>, self.func) # 为标记添加单击事件 # 单选按钮 self.v = tk.StringVar() self.v.set(F) self.r1 = tk.Radiobutton(self, text=男, value=M,variable=self.v) self.r2 = tk.Radiobutton(self, text=女, value=F, variable=self.v) # 取值 self.v.get() # 复选按钮 self.flag = tk.IntVar() # 默认值为0 self.c1 = tk.Checkbutton(self, text=test, variable=self.flag, onvalue=1, offvalue=0) #选中值为1,不选择值为0 # 选择项 OptionMenu self.v = tk.StringVar() self.v.set(sun) om = tk.OptionMenu(self, self.v, sun, qiu, lin) # 取值v.get() # 移动滑块 s1 = tk.Scale(self,from_=10, to=50, length=200, tickinterval=5, orient=tk.HORIZONTAL, command=self.func) def func(self, value): print(滑块的值是, value) # 颜色选择框 from tkinter.colorchooser import askcolor s1 = askcolor(color=red, title=选择颜色) print(s1) # ((74.2890625, 125.48828125, 181.70703125), '#4a7db5') #文件对话框 from tkinter.filedialog import askopenfilename f = askopenfilename(title=选择文件, initialdir=d:, filetypes=[(文本文件,.txt)]) print(f) # D:/abc.txt # tkinter.filedialog 还有返回多个文件及返回一个或者多个文件对象的函数,还有返回目录名函数. 还有返回保存的文件名及对象的函数 # 简单输入对话框 import tkinter.simpledialog as ts t = ts.askinteger(title=输入年龄, prompt=请输入年龄, initialvalue=18, minvalue=1, maxvalue=100) print(t) # t返回的值 # 还有askfloat() askstring() # 通用消息框 from tkinter.messagebox import * a1 = showinfo(title=hh,message=heihei) # a1 返回ok #'askokcancel', 'askquestion', 'askretrycancel', 'askyesno', 'askyesnocancel', 'showerror', 'showinfo', 'showwarning' # 菜单 menubar = tk.Menu(win) # 创建主菜单栏 menuFile = tk.Menu(menubar) # 创建子菜单 menubar.add_cascade(label=文件,menu=menuFile) # 将子菜单加入到主菜单栏 menuFile.add_command(label=新建, accelerator=ctrl+n, command=self.func) # 添加菜单项 menuFile.add_separator() # 添加分割线 win[menu] = menubar # 将主菜单栏加到根窗口 # 上下文菜单(右键菜单) menubar = tk.Menu(win) # 创建菜单 menubar.add_command(label=test,command=...) win.bind(<Button-3>,func_) def func_(event): menubar.post(event.x_root, event.y_root) # 在鼠标右键单击坐标处显示菜单
6 事件绑定
''' tkinter中事件绑定方法可以分为两大类: 组件对象的绑定,包含2种方法: 通过command属性绑定,适合简单不需要获取event对象的情况, 例如:Button(root,text=登录,command=login); 通过bind()方法绑定,适合需要获取event对象的情况, 例如:l=Label(text=A); l.bind(<Button-1>,sendMessage); 组件类的绑定:通过调用对象的bind_class函数,将该组件类所有的组件绑定事件, 例如btn.bind_class(<Button-1>,func) ''' from tkinter import * # 按钮绑定事件的方式 def mouse_test01(name, sex): print(command方式绑定,不能直接获取event对象,可以接受参数) print(name:{},b:{}.format(name, sex)) def mouse_test02(event): print(bind()方式绑定,可以获取event对象) print(event.widget) def mouse_test03(event): print(bind_class方式绑定所有类,可以获取event对象) print(event.widget) if __name__ == '__main__': root = Tk() btn01 = Button(root, text=command方式绑定, command=lambda: mouse_test01(sz, male)) btn01.pack() btn02 = Button(root, text=bind()方式绑定) btn02.bind(<Button-1>, mouse_test02) btn02.pack() # 给所有按键添加右键事件 btn01.bind_class(Button, <Button-3>, mouse_test03) root.mainloop()