【Python】Tkinter使用中遇到的问题&解决方案

汇集在使用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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值