知道你们连Github都懒得打开所以在这里放上你们想用的代码
完整代码见上篇文章:Python tkinter界面设计,开源的Python Tk应用程序,U盘修复工具-CSDN博客
目录
任务栏图标
首先是任务栏图标,在Python的Tkinter库中,要设置应用程序在任务栏(Windows系统托盘)上的图标,可以使用tkinter
的tix
模块或者第三方库如pywin32
、pystray
等来实现。由于原生Tkinter并不直接支持系统托盘图标,但可以通过一些间接方式来达到目的。我们这里使用第三方库pystray。
安装pystray
库:
pip install pystray
U盘修复中使用的方法:
global tray_icon # 全局变量
......
# 创建系统托盘图标
def create_tray_icon():
show_info() # 最小化提示
# 从图片文件中加载图标
image = Image.open("Pictures/ICON.ico")
# 创建系统托盘菜单
menu = (
pystray.MenuItem("打开U盘修复", lambda: open_app()),
pystray.MenuItem("退出", lambda: exit_app())
)
# 创建系统托盘图标
global tray_icon
tray_icon = pystray.Icon("app_name", image, "U盘修复", menu)
# 设置图标的提示文本
tray_icon.tooltip = "U盘修复2.0"
# 显示系统托盘图标
tray_icon.run()
# 点击“打开应用”菜单项的事件处理函数
def open_app():
global tray_icon # 引用全局变量
# 关闭托盘图标
tray_icon.stop()
# 这里使用subprocess启动主窗口,因为之前我们关闭了主窗口,所以要再次启动一边
subprocess.Popen(["U盘修复2.0.exe"]) # 应用程序的实际路径
# 点击“退出”菜单项的事件处理函数
def exit_app():
global tray_icon # 引用全局变量
# 关闭托盘图标并退出程序
tray_icon.stop()
sys.exit(0)
# 正常退出
if __name__ == "__main__":
ui = Ui_MainWindow()
create_tray_icon() # 退出就创建系统托盘图标
但是我过后发现,这样主窗口是已经关闭了,要再启动一次程序,所以今天我改了一下,隐藏窗口然后再显示:
global tray_icon # 全局变量
# 我们在def __init__(self):下加上
class Ui_MainWindow:
def __init__(self):
# 创建主窗口
self.window = tk.Tk()
......
def create_tray_icon():
self.window.withdraw() # 隐藏主窗口但不退出程序
# 创建系统托盘图标
show_info() # 最小化提示
# 从图片文件中加载图标
image = Image.open("Pictures/ICON.ico")
# 创建系统托盘菜单
menu = (
pystray.MenuItem("打开U盘修复", lambda: open_app()),
pystray.MenuItem("退出", lambda: exit_app())
)
# 创建系统托盘图标
global tray_icon
tray_icon = pystray.Icon("app_name", image, "U盘修复", menu)
# 设置图标的提示文本
tray_icon.tooltip = "U盘修复2.0"
# 显示系统托盘图标
tray_icon.run()
# 点击“打开应用”菜单项的事件处理函数
def open_app():
global tray_icon # 引用全局变量
# 关闭托盘图标
tray_icon.stop()
# 显示已隐藏的主窗口
self.window.deiconify()
# 点击“退出”菜单项的事件处理函数
def exit_app():
global tray_icon # 引用全局变量
# 关闭托盘图标并退出程序
tray_icon.stop()
os._exit(0)
# 立即终止整个Python解释器
# 绑定关闭事件,当点击关闭按钮时隐藏窗口而不是退出程序
self.window.protocol("WM_DELETE_WINDOW", create_tray_icon)
self.window.mainloop()
这样就不会退出后需要用subprocess启动主窗口了
图片背景透明
def crop_white_background(image_path):
# 打开图像
image = Image.open(image_path)
# 转换为RGBA模式,以支持透明度
image = image.convert("RGBA")
# 获取图像的宽度和高度
width, height = image.size
# 遍历每个像素点,将白色背景的像素设为透明
for x in range(width):
for y in range(height):
r, g, b, a = image.getpixel((x, y))
if r == 255 and g == 255 and b == 255: # 判断是否为白色背景
image.putpixel((x, y), (255, 255, 255, 0)) # 将白色背景设为透明
# 裁剪图像,去除透明边缘
cropped_image = image.crop(image.getbbox())
# 保存裁剪后的图像
cropped_image.save("")
# 透明图片,你也可以用这个方法做一个启动画面
TRANSCOLOUR = 'gray' # 'gray'为透明色 ( 我称为心灵的窗户)
self.window.wm_attributes("-transparentcolor", TRANSCOLOUR) # 设置'gray'为透明色
photo = ImageTk.PhotoImage(file=r"Pictures/USB flash drive.png")
label = Label(self.window, image=photo, bg=TRANSCOLOUR)
label.place(x=50, y=20, anchor=tk.NW)