虽说使用pyqt5开发图形界面更美观,更高效,但想要开发轻量级的小工具,pyqt5不免太过庞大,这时tkinter就派上用场了。
一、一个简单的tkinter模板
import tkinter as tk
from PIL import Image, ImageTk
class AppUI():
def __init__(self):
self.root = tk.Tk()
self.x = 0
self.y = 0
self.init_ui()
def init_ui(self):
#self.root.overrideredirect(True) #去除边框
#self.root.attributes("-alpha", 0) #整个窗口透明
#self.root.iconbitmap('favicon.ico') #设置窗口图标
#self.root.attributes("-transparentcolor", "#CDCDB4") # 将指定颜色变成透明颜色
#self.root.wm_attributes('-topmost',1) #窗口置顶
self.root.title("test")
self.root.resizable(False, False) # 此调用方法会禁止根窗体改变大小
scnWidth, scnHeight = self.root.maxsize() #获取屏幕的大小
x, y = (scnWidth-1000)/2, (scnHeight-648)/2 #定位窗口居中显示的坐标
self.root.geometry("1000x648+%d+%d" % (x,y)) #大小为1000x648,位置在(x,y)的主窗口
self.canvas = tk.Canvas(self.root, width = 1000,height = 648)
#bg = tk.PhotoImage(file='img.gif') #只支持gif格式
bdgd = Image.open('imgs/bg.png')
bg = ImageTk.PhotoImage(bdgd)
self.canvas.create_image(500,324,image=bg)
self.canvas.configure(highlightthickness = 0)
self.canvas.bind("<B1-Motion>",self.move)
self.canvas.bind("<Button-1>",self.button_1)
self.canvas.pack()
self.root.mainloop()
def move(self, event):
new_x = (event.x-self.x)+self.root.winfo_x()
new_y = (event.y-self.y)+self.root.winfo_y()
s = "1000x648+" + str(new_x)+"+" + str(new_y)
self.root.geometry(s)
def button_1(self, event):
self.x, self.y = event.x,event.y
if __name__=='__main__':
AppUI()
1. 去除边框
self.root.overrideredirect(True)
该方法设置覆盖重定向标志,这将删除窗口中的所有窗口管理器的装饰,使其无法移动,调整大小,图标化或关闭。
(此方法需谨慎使用,使用后没有任务图标了)
2. 窗口拖动的实现
因为去除边框,窗口无法移动,所以需自己实现窗口的拖动 ;
这里是用两个鼠标事件实现的:
self.canvas.bind("<B1-Motion>",self.move)
self.canvas.bind("<Button-1>",self.button_1)
这其中的"<B1-Motion>"是鼠标左键点击移动事件,"<Button-1>"是左键单击事件
3. 画布canvas 添加背景图片
如果是gif图片,可直接调用 tk.PhotoImage(file='img.gif')
其他格式的图片,需调用PIL库,该库的安装(pip install pillow),怎么使用具体看上面实例
然后再create_image(500,324,image=bg),这其中的500x324是1000x648的一半,正好是画布的中心点
二、使用pyinstaller打包exe时,图片资源的导入
1. pip install pyinstaller
2. 使用base64将图片资源编码到一个py文件中
import base64
import os
def pic2py(picture_name):
open_pic = open("imgs/%s" % picture_name, 'rb')
b64str = base64.b64encode(open_pic.read())
open_pic.close()
# 注意这边b64str一定要加上.decode()
write_data = '%s = "%s"\n' % (picture_name.replace('.', '_'), b64str.decode())
f = open('imgs_rc.py', 'a+')
f.write(write_data)
f.close()
if __name__ == '__main__':
dir = 'imgs' #存放图片资源的文件夹
for img in os.listdir(dir):
pic2py(img)
3. imgs_rc.py的使用
头部导入要使用到的文件及库
import io, base64
from imgs_rc import *
将下面圈出来的改成右边的,就大功告成了。