赞
踩
import tkinter as tk root = tk.Tk() root.title('窗口参数设置') # 设置窗口标题。 root.iconbitmap(r'.\kenan.ico') # 设置窗口左上角的图标。 "获取电脑屏幕尺寸大小" window_x = root.winfo_screenwidth() window_y = root.winfo_screenheight() "设置窗口大小参数" WIDTH = 500 HEIGHT = 350 "获取窗口左上角的X, Y坐标,用来设置窗口的放置位置为屏幕的中间。" x = (window_x - WIDTH) / 2 y = (window_y - HEIGHT) / 2 root.geometry(f'{WIDTH}x{HEIGHT}+{int(x)}+{int(y)}') root.resizable(width=True, height=True) # 设置是否禁止调整窗口的宽和高。 root.minsize(250, 250) # 设置窗口的最小尺寸。 root.maxsize(800, 600) # 设置窗口的最大尺寸。 win_width = root.winfo_width() #获取窗口宽度(单位:像素) win_height = root.winfo_height() #获取窗口高度(单位:像素) x=root.winfo_x() #获取窗口左上角的 x 坐标(单位:像素) y=root.winfo_y() #获取窗口左上角的 y 坐标(单位:像素) # print(win_width, win_height, x, y) #root.attributes("-toolwindow", 1) # 工具栏样式。参数1:没有最大化/最小化按钮。 #root.attributes("-topmost", 1) # 窗口置顶显示。 # root.overrideredirect(True) #参数True,隐藏窗口标题栏。即不显示窗口标题和最大化、最小化、关闭按钮。 # root.state("iconic") # 隐藏窗口,可以在任务管理器中查看,相当于在后台运行了。 # root.state("normal") # 设置为普通窗口。 # root.withdraw() # 从屏幕中移除窗口。相当于影藏窗口了(并没有销毁)。 # root.deiconify() # 使窗口重新显示在电脑屏幕上。 # root.attributes("-fullscreen", True) # 全屏显示,用 Windows 热键 “ Alt+F4 ” 关闭这个全屏的Tkinter窗口。 root.attributes("-alpha",0.8) #设置窗口的透明度 0.8, 参数为 0 到 1。 "Toplevel有和顶层窗口一样的属性。" top_window = tk.Toplevel(root) top_window.geometry(f'260x200+{int(x)+50}+{int(y)+50}') top_window.transient(root) # 使弹出窗口一直置于 root 窗口之上。 tk.mainloop()
tk.StringVar()
tk.IntVar()
tk.DoubleVar()
控件显示简图
颜色说明
字体设置详细方法
对齐和浮雕风格
位图和图片格式
label = tk.Label(root,text='我是一个标签', # text为显示的文本内容
bg='black',fg='white', # bg为背景色,fg为前景色
font=("华文行楷", 20), # 设置字体为“华文行楷”,大小为20
width=30,height=3) # width为标签的宽,height为高
tk.Button(window,width=20,height=2,text='单击',command=回调函数)
默认情况下,variable 选项设置为 1 表示选中状态,反之设置为 0。你可以使用 onvalue 和 offvalue 选项修改它们的值,例如下边代码,只要 var 被设置为“T”即选中状态,设置为“F”则相反:
var = tk.StringVar()
var.set("T")
c = tk.Checkbutton(root, text="你喜欢Python吗", variable=var, onvalue="T", offvalue="F")
为了实现其“单选”行为,确保一组中的所有按钮的 variable 选项都使用同一个变量,并使用 value 选项来指定每个按钮代表什么值:
v = tk.IntVar()
v.set(2)
tk.Radiobutton(root, text="One", variable=v, value=1).pack(anchor="w")
tk.Radiobutton(root, text="Two", variable=v, value=2).pack(anchor="w")
tk.Radiobutton(root, text="Three", variable=v, value=3).pack(anchor="w"
f_top = tk.Frame(root, height=65, width=1080, bd=1, relief="flat") # "sunken" "raised","groove" 或 "ridge"
f_top.pack_propagate(False) # 如果不加这个参数,当Frame框架中加入部件时,会自动变成底层窗口,自身的特性会消失。
f_top.pack(side='top', pady=5)
e = tk.Entry(window, show='*', font=('Arial', 14)) # 显示成密文形式
v = tk.StringVar()
e = tk.Entry(master, textvariable=v)
text = tk.Text(root, width=40, height=5)
from tkinter import * class App: def __init__(self, master): self.master = master self.initWidgets() def initWidgets(self): topF = Frame(self.master) topF.pack(fill=Y, expand=YES) # 定义StringVar变量 self.v = StringVar() # 创建Listbox组件,与v变量绑定 self.lb = Listbox(topF, listvariable = self.v) self.lb.pack(side=LEFT, fill=Y, expand=YES) for item in range(20): self.lb.insert(END, str(item)) # 创建Scrollbar组件,设置该组件与self.lb的纵向滚动关联 scroll = Scrollbar(topF, command=self.lb.yview) # 设置self.lb的纵向滚动影响scroll滚动条 self.lb.configure(yscrollcommand=scroll.set) scroll.pack(side=RIGHT, fill=Y) f = Frame(self.master) f.pack() Button(f, text="选中10项", command=self.select).pack(side=LEFT) Button(f, text="清除选中3项", command=self.clear_select).pack(side=LEFT) Button(f, text="删除3项", command=self.delete).pack(side=LEFT) Button(f, text="绑定变量", command=self.var_select).pack(side=LEFT) def select(self): # 选中指定项 self.lb.selection_set(0, 9) print(self.lb.curselection()) # 获取选中的元素的索引值。 print(self.lb.size()) # 获取列表框中所有元素的数量。 def clear_select(self): # 取消选中指定项 self.lb.selection_clear(1,3) print(self.lb.curselection()) # 获取选中的元素的索引值。 def delete(self): # 删除指定项 self.lb.delete(5, 8) def var_select(self): # 修改与Listbox绑定的变量,即直接把列表中的元素替换成 set()中的元组了。 self.v.set(('set12', 'set15')) print(self.v.get()) root = Tk() root.title("Listbox测试") App(root) root.mainloop()
相当于 一个 Entry和“下拉栏”的组合。
即提供一个“输入框”用来输入信息,和“下拉栏”可以快捷选择输入。
import tkinter as tk from tkinter import ttk root = tk.Tk() root.title("Combobox测试") strVar = tk.StringVar() def choose(): ''' 获取 Combbox 的当前值 的方法''' print('cb.get()方法获取的值:', cb.get()) # 方法1 print('strVar.get()方法获取的值:', strVar.get()) # 方法2 "创建Combobox组件" cb = ttk.Combobox(root, textvariable=strVar, # 绑定到self.strVar变量 postcommand=choose) # 当用户单击 下拉箭头 时触发 choose 方法 cb.pack(side=tk.TOP) "为Combobox配置多个选项" cb['values'] = ['Python', 'Ruby', 'Kotlin', 'Swift'] f = tk.Frame(root) f.pack() """ 给 Combobox 绑定变量""" isreadonly = tk.IntVar() def change(): """设置 Combobox 输入框是否 只读 属性。 如果设置 为 readonly, 那就不能在 Combobox 中手动输入内容了。""" cb['state'] = 'readonly' if isreadonly.get() else 'enable' def setvalue(): """两种方法 在 Combobox 框中输入内容""" # cb.insert('end', '插入元素') # 方法 1. strVar.set('我爱Python') # 方法 2. # 创建Checkbutton,绑定到isreadonly变量 tk.Checkbutton(f, text='是否只读:', variable=isreadonly, command=change).pack(side=tk.LEFT) # 创建Button,单击该按钮激发setvalue方法 tk.Button(f, text='绑定变量设置', command=setvalue).pack(side=tk.LEFT) root.mainloop()
import tkinter as tk root = tk.Tk() """ 先建立一个 listbox 框,等会用来绑定 滚动条 """ Lb = tk.Listbox(root) for i in range(1, 101): Lb.insert('end', i) Lb.pack(side='left', expand=1) Sl = tk.Scrollbar(root) # 建立 滚动条部件。 Sl.config(orient='vertical') # 设置滚动条显示方向:vertical=垂直,horizontal=水平。 Sl.pack(side='left', fill='y', expand=1) """关联 列表框 和 滚动条""" # 用列表框的 yscrollcommand (垂直移动)属性绑定到 滚动条的set() 方法。 Lb.config(yscrollcommand=Sl.set) # 列表框 → 控制 → 滚动条, # 即当鼠标中键在列表框内滚动时,滚动条的滑块会对应的移动。 #Lb['yscrollcommand'] = Sl.set # 也可以这样写,效果一样。 # 滚动条用 command 属性 绑定到 列表框的 yview 移动方向。 Sl.config(command=Lb.yview) # 滚动条 → 控制 → 列表框。 # 即当滑动滚动条的滑块时,列表框的内容也会对应移动。 #Sl['command'] = Lb.yview # 也可以这样写,效果一样。 root.mainloop()
import tkinter as tk root = tk.Tk() root.title("Scale测试") doubleVar = tk.DoubleVar() def change(value): """ 获取Scale值的三种方式: 1、Scale 绑定的函数,它会接收到Scale部件传过来的一个值。 2、通过 Scale 部件的 get()方法。 3、通过绑定变量的 get()方法。""" print(value, scale.get(), doubleVar.get()) scale = tk.Scale(root, label='示范Sacle', # 设置标签内容 from_=-100, # 设置最大值 to=100, # 设置最小值 resolution=5, # 设置步长 length=400, # 设置轨道的长度 width=30, # 设置轨道的宽度 orient=tk.HORIZONTAL, # 设置水平方向 digits=10, # 设置十位有效数字,即显示的数字个数。 command=change, # 绑定事件处理函数,会自动传入一个“当前值”的参数进去。 variable=doubleVar # 绑定变量 ) scale.pack() scale.set(20) # 设置Scale的当前值 root.mainloop()
这个部件不能设置轨道的固定长度 和 回调参数。
import tkinter as tk from tkinter import ttk root = tk.Tk() root.title("LabeledScale测试") root.geometry(f'500x300+500+300') scale = ttk.LabeledScale(root, from_=-100, # 设置最大值 to=200, # 设置最小值 compound = 'top' # 设置显示数值在轨道的位置。 ‘bottom':下方。 ) scale.pack(fill='x', expand=1) scale.value = 20 # 设置初始值。 def command_func(): '''获取滑块的值''' print(scale.value) ttk.Button(root, text='获取滑块值', command=command_func).pack(pady=20) root.mainloop()
import tkinter as tk
root = tk.Tk()
root.mainloop()
上面生成的 root 窗口有一个‘menu’属性,只要在这个属性中添加一个 菜单 的部件,就能在窗口顶部生成一个菜单条。
所以 第 1 步 要做的就是 生成一个菜单部件:
menubar = tk.Menu(root) # 参数也可为空,即 menubar = tk.Menu()
此时的菜单部件由于没有添加任何内容,所以是一个空的部件,即使把它添加到root的菜单属性中,我们也看不到任何东西。
代码如下:
import tkinter as tk
root = tk.Tk()
menubar = tk.Menu()
root.config(menu=menubar) # 添加 root 窗口的菜单属性,方法1。
# root['menu'] = menubar # 添加 root 窗口的菜单属性,方法2。
root.mainloop()
生成的窗口是这样的,看不到菜单条的任何内容。
接下来,就是往 菜单部件 中塞内容了。
import tkinter as tk
root = tk.Tk()
menubar = tk.Menu() # 生成一个菜单部件。
root.config(menu=menubar) # 把菜单部件添加到 root 窗口的菜单属性中。
# root['menu'] = menubar
photo = tk.PhotoImage(file='路径/名字.png') # 创建图片实例
menubar.add_command(label='文件',
command=None,
image=photo, # 加入图片。可以参考 lable 中加图片的方法。
compound=tk.LEFT) # 图片的放置位置。可以参考 lable
menubar.add_command(label='设置', command=None)
root.mainloop()
上面利用 add_command 添加的菜单,其实就像添加了一个 button。
如果想要点击一个菜单后,它会展开 里面还有供选择的菜单,
可以使用 add_cascade() 往菜单部件中添加菜单部件。
import tkinter as tk root = tk.Tk() menubar = tk.Menu(tearoff=False) root.config(menu=menubar) menubar.add_command(label='文件', command=None) menubar.add_command(label='设置', command=None) choice_1 = tk.IntVar() choice_2 = tk.IntVar() def get_value_1(): """获取多选菜单点击后,返回的值:选中为 1,取消为 0""" print(choice_1.get()) def get_value_2(): """获取单选菜单点击后,返回的值:选中 1 返回值为 11;选中 2 返回值为 12,""" print(choice_2.get()) """设置展开菜单""" more_menu = tk.Menu(tearoff=False) # 新建一个 菜单部件。 menubar.add_cascade(label='展开', menu=more_menu) # 把这个菜单部件添加到 menubar 这个菜单中。 more_menu.add_checkbutton(label='多选菜单', variable=choice_1, command=get_value_1) more_menu.add_separator() # 分割线。 more_menu.add_radiobutton(label='单选菜单1', variable=choice_2, value=11, command=get_value_2) more_menu.add_radiobutton(label='单选菜单2', variable=choice_2, value=12, command=get_value_2) root.mainloop()
菜单部件有个 post(x, y)方法, 用来在坐标(x, y) 处展示菜单。
import tkinter as tk root = tk.Tk() menubar = tk.Menu() # root['menu'] = menubar # 没有把这个 菜单部件 加入到 root 窗口的菜单属性中,所以它不会在root窗口的顶部显示。 menubar.add_command(label='文件', command=None) menubar.add_command(label='设置', command=None) def show_menu(event): """用 菜单部件 的 post 方法展示菜单""" menubar.post(event.x_root, event.y_root) root.bind('<Button-3>', show_menu) # root 窗口绑定鼠标右键 root.mainloop()
from tkinter import * # 导入ttk from tkinter import ttk class App: def __init__(self, master): self.master = master self.initWidgets() def initWidgets(self): self.sv = StringVar() # 创建一个变量 menus = ('Kotlin','Ruby','Swift','Java','Python','JavaScript','Erlang',) # 创建一个OptionMenu控件 self.om = ttk.OptionMenu(root, self.sv, # 第二个参数 绑定变量 'Python', # 第三个参数 设置初始选中值 *menus, # 第四个参数 设置菜单弹出的内容, 需在变量前加 * 进行解包。 command=self.print_option # 绑定事件处理方法,和 Scale 部件一样,会自动传入一个选中值作为参数。 ) self.om.pack() # 创建Labelframe容器 lf = ttk.Labelframe(self.master, padding=20, text='请选择菜单方向') lf.pack(fill=BOTH, expand=YES, padx=10, pady=10) # 定义弹出菜单位置的 5 个参数。 self.directions = ['below', 'above', 'left', 'right', 'flush'] i = 0 self.intVar = IntVar() self.intVar.set(0) # 设置变量的初始值。 # 使用循环创建多个Radiobutton,并放入Labelframe中 for direct in self.directions: Radiobutton(lf, text=direct,value=i, command=self.change, variable=self.intVar).pack(side=LEFT) i += 1 def print_option(self, val): # 通过 两种方式 来获取OptionMenu 选中的菜单项的值。 print(self.sv.get(), val) def change(self): # 通过direction选项改变OptionMenu上菜单的展开方向 self.om['direction'] = self.directions[self.intVar.get()] root = Tk() root.title("OptionMenu测试") App(root) root.mainloop()
事件整理:
7、鼠标键盘事件
<Button-1> 鼠标左键按下,2表示中键,3表示右键; <ButtonPress-1> 同上; <ButtonRelease-1> 鼠标左键释放; <B1-Motion> 按住鼠标左键移动; <Double-Button-1> 双击左键; <Enter> 鼠标指针进入某一组件区域; <Leave> 鼠标指针离开某一组件区域; <MouseWheel> 滚动滚轮; <KeyPress-A> 按下A键,A可用其他键替代; <Alt-KeyPress-A> 同时按下alt和A;alt可用ctrl和shift替代; <Double-KeyPress-A> 快速按两下A; <Lock-KeyPress-A> 大写状态下按A; <Key> 指键盘的任意按键,
8、窗口事件
Activate 当组件由不可用转为可用时触发; Configure 当组件大小改变时触发; Deactivate 当组件由可用转变为不可用时触发; Destroy 当组件被销毁时触发; Expose 当组件从被遮挡状态中暴露出来时触发; Unmap 当组件由显示状态变为隐藏状态时触发; Map 当组件由隐藏状态变为显示状态时触发; FocusIn 当组件获得焦点时触发; FocusOut 当组件失去焦点时触发; Property 当窗体的属性被删除或改变时触发; Visibility 当组件变为可视状态时触发;
9、响应事件
event对象(def func(event))的API:
char 返回 按键字符,仅对键盘事件有效;
keycode 返回 按键编码,仅对键盘事件有效;
keysym 返回 按键名,仅对键盘事件有效;
num 数字按键,仅对数字事件有效;
type 所触发的事件类型;
widget 引起事件的组件;
width,heigh 组件改变后的大小,仅Configure有效;
x,y 返回鼠标当前位置,相对于窗口;
x_root,y_root 返回鼠标当前位置,相对于整个屏幕
pack 使用说明
pack 参数:
1、anchor :当可用空间大于组件所需求的大小时, 该选项决定组件被放置在容器的何处。该选项支持N (北,代表上)、E (东,代表右)、S(南,代表下)、W( 西,代表左)、NW (西北,代表左上〉、N E (东北,代表右上)、SW (西南,代表左下〉、SE (东南,代表右下)、CENTER (中,默认值)这些值。
2、 expand : 该bool 值指定当父容器增大时是否拉伸组件。
3、fill : 设置组件是否沿水平或垂直方向填充。该选工页支持NONE 、X 、Y 、BOTH 四个值,其中NONE 表示不填充, BOT H 表示沿着两个方向填充。
4、ipadx:指定组件在x 方向(水平)上的内部留白(填充 )。
5、ipady:指定组件在y 方向(水平〉上的内部留白(填充 )。
6、padx : 指定组件在x 方向(水平)上与其他组件的间距。
7、pady :指定组件在y 方向(水平)上与其他组件的间距。
8、side : 设置组件的添加位置,可以设置为TOP 、BOTTOM 、LEFT 或RIGHT 这四个值的其中之一。
ttk带有17个小部件,其中11个已经存在于Tkinter中:Button,Checkbutton,Entry,Frame,Label,LabelFrame,Menubutton,PanedWindow,Radiobutton,Scale和Scrollbar。
6个新的窗口小部件类是:Combobox,Notebook,Progressbar,Separator,Sizegrip和Treeview。 所有这些类都是Widget的子类。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。