汇集在使用Tkinter开发时遇到的问题以及相应解决代码
好用的资源:https://tkdocs.com/tutorial/firstexample.html
0 引用库方式
import tkinter as tk
from tkinter import ttk
from tkinter import messagebox
1 窗口设置
1.1 窗口居中、大小固定
def window_set_to_center(win, window_width, window_height):
#得到屏幕宽度
sw = win.winfo_screenwidth()
#得到屏幕高度
sh = win.winfo_screenheight()
#窗口宽高为100
x = (sw-window_width) / 2
y = (sh-window_height) / 2
win.geometry("%dx%d+%d+%d" %(window_width,window_height,x,y))
#防止用户调整尺寸
win.resizable(0,0)
1.2 新建窗口、聚焦/选中新窗口
win:新建的子窗口
win=tk.Toplevel()
win.focus_force() #选中窗口
root.attributes('-disabled', True) #不可操作主窗口
关闭子窗口、聚焦主窗口
def close_settings_window(win,root):
win.destroy()
root.attributes('-disabled', False)
root.focus_force()
#关闭设置窗口,激活主窗口
win.protocol('WM_DELETE_WINDOW', lambda:close_settings_window(win,root))
2 窗口布局
grid使用colum、row判断本组件在父组件中的位置(组件创建时进行规定)
columnconfigure、rowconfigure判断所属编号colum、row占比
columnspan、rowspan为组件所占colum、row数量
sticky为组件紧贴位置
###组件位置###
#主窗口
mainframe.grid(column=0, row=0, sticky=tk.NSEW)
mainframe.columnconfigure(0, weight=1)
mainframe.columnconfigure(1, weight=1)
mainframe.columnconfigure(2, weight=1)
#界面1
frame1.grid(column=0, row=0, columnspan=3, sticky=tk.NSEW)
f1_ck1.grid(column=0, row=0, sticky=tk.NSEW)
f1_ck2.grid(column=1, row=0, sticky=tk.NSEW)
#界面2
frame2.grid(column=0, row=1, columnspan=3, sticky=tk.NSEW)
f2_rb1.grid(column=0, row=0, sticky=tk.NSEW)
f2_rb2.grid(column=0, row=2, sticky=tk.NSEW)
f2_rb3.grid(column=0, row=3, sticky=tk.NSEW)
#界面3
frame3.grid(column=0, row=2, columnspan=3, sticky=tk.NSEW)
f3_but1.grid(column=0,row=0)
f3_ent1.grid(column=1,row=0,padx=5)
f3_but2.grid(column=0,row=1)
f3_ent2.grid(column=1,row=1,padx=5)
#按钮
but_upload.grid(column=1,row=3,pady=10)
but_settings.grid(column=0,row=3,pady=10)
but_quit.grid(column=2,row=3,pady=10)
3 Tkinter变量使用
3.1 选择框
ck1=tk.IntVar()
#上传项目选项
f1_ck1=ttk.Checkbutton(frame1,text='勾选框1', variable=ck1, onvalue=1, offvalue=0)
#功能函数中获取变量值进行判断
if ck1.get()==1:
#如果被选中,执行以下code
pass
未选中: ck1.get()返回值为0
选中:ck1.get()返回值为1
3.2 单选框
#单选变量
time_ck=tk.IntVar()
#默认选中第一个选项
time_ck.set(1)
#单选选项
f2_rb1=ttk.Radiobutton(frame2,text='单选1',variable=time_ck,value=1)
f2_rb2=ttk.Radiobutton(frame2,text='单选2',variable=time_ck,value=2)
f2_rb3=ttk.Radiobutton(frame2,text='单选3',variable=time_ck,value=3)
通过 set() 可以设置默认选项
3.3 文本输入
#变量
start_date=tk.StringVar()
#显示
f3_ent1=tk.Entry(frame3,textvariable=start_date)
4 icon设置
4.1 文件设置icon
win.iconphoto(False,tk.PhotoImage(file='ICON_IMG.PNG'))
4.2 编码设置icon
为了在打包时不遗漏图片文件
#编码后图片数据直接复制粘贴
ICON_IMG=b'xxxxx'
win.iconphoto(False,tk.PhotoImage(data=ICON_IMG))
图片编码:python tkinter把图标一起打包到exe中
from tkinter import *
import webbrowser
import time, datetime
import re
import base64
open_icon = open("qq.ico","rb") #qq.icon为你要放入的图标
b64str = base64.b64encode(open_icon.read()) #以base64的格式读出
open_icon.close()
write_data = "img=%s" % b64str
f = open("qq.py","w+") #将上面读出的数据写入到qq.py的img数组中
f.write(write_data)
f.close()
版权声明:此块代码摘自优快云博主「気絿」的原创文章
原文链接:https://blog.youkuaiyun.com/vinkim/article/details/102914579