如何让Tkinter程序启动时自动隐藏窗口,仅从托盘运行?
实现托盘程序启动时自动隐藏窗口
你的需求完全可行,只需在窗口初始化后立即调用withdraw()方法就能实现启动时自动隐藏窗口,同时不影响后续通过托盘菜单恢复显示的功能。
修改方案
有两种简单的实现方式:
方式一:在窗口创建后直接隐藏
在初始化tk.Tk()对象后,立刻调用withdraw():
window = tk.Tk() window.title("Welcome") window.withdraw() # 启动时隐藏窗口
方式二:在trayRun类的初始化方法中隐藏
在trayRun的__init__方法开头添加隐藏逻辑:
class trayRun(): def __init__(self,main): self.main = main self.main.withdraw() # 启动时隐藏窗口 # 后续原有代码...
修改后的完整代码(以方式一为例)
from pystray import MenuItem as item import pystray from PIL import Image import tkinter as tk from tkinter import ttk import sys import os window = tk.Tk() window.title("Welcome") window.withdraw() # 关键修改:启动时隐藏窗口 class trayRun(): def __init__(self,main): self.main = main self.image = Image.open("logo.png") self.menu = (item('Quit', self.quit_window), item('Show', self.show_window)) self.icon = pystray.Icon("name", self.image, "title", self.menu) self.main.protocol('WM_DELETE_WINDOW', self.withdraw_window) self.buttonOK = ttk.Button(self.main, text='OK', command=self.ok, width=100) self.buttonClose = ttk.Button(self.main, text='Close window', command=self.withdraw_window, width=100) self.buttonOK.pack(side=tk.BOTTOM) self.buttonClose.pack(side=tk.BOTTOM) self.isTray = False self.run_icon() def ok(self): print('OKOK') def quit_window(self): self.icon.stop() self.main.destroy() sys.exit() # 替换os._exit(1),更安全的退出方式 def show_window(self): self.main.deiconify() def withdraw_window(self): self.main.withdraw() def run_icon(self): if not self.isTray: self.icon.run_detached() self.isTray = True trayRun = trayRun(main=window) window.mainloop()
补充说明
withdraw()方法只是将窗口从屏幕上隐藏,不会销毁窗口对象,后续通过deiconify()可以正常恢复显示,完全适配你的托盘菜单逻辑。- 替换了原代码中
os._exit(1)为sys.exit(),前者会强制终止进程,可能导致资源无法正常释放,后者更符合Python程序的退出规范。
内容的提问来源于stack exchange,提问作者MooNChilD Song
相关产品推荐
相关产品推荐

