You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Python pystray时点击系统托盘图标如何最大化窗口并解决报错?

解决方案:实现点击pystray托盘图标直接恢复Tkinter窗口

错误原因

你遇到的TypeError: 'tuple' object is not callable报错,是pystray的默认点击逻辑导致的:默认情况下左键点击托盘图标时,pystray会尝试调用菜单的默认触发动作,如果你没有给菜单项设置默认属性,也没有自定义图标点击回调,pystray就会尝试直接调用菜单元组对象,进而抛出类型错误。


实现方案(两种可选)

方案1:设置默认菜单项(最简单)

直接给你现有的「显示」菜单项添加default=True参数,pystray就会将该菜单项作为左键点击图标时的默认触发动作,无需额外绑定事件:

import tkinter as tk
import pystray
from PIL import Image

# 初始化Tk窗口
root = tk.Tk()
root.title("托盘测试应用")

# 恢复窗口逻辑
def show_window():
    # 用after调度保证UI操作在主线程执行,避免线程冲突
    root.after(0, lambda: [
        root.deiconify(),
        root.attributes("-topmost", True),
        root.attributes("-topmost", False)
    ])

# 退出逻辑
def quit_app():
    icon.stop()
    root.after(0, root.destroy)

# 定义托盘菜单,给显示项加default=True
tray_menu = (
    pystray.MenuItem("显示", show_window, default=True),
    pystray.MenuItem("退出", quit_app)
)

# 加载托盘图标(替换为你自己的图标路径)
tray_icon = Image.open("your_icon.png")
icon = pystray.Icon("app_name", tray_icon, "应用名称", tray_menu)

# 最小化到托盘逻辑
def minimize_to_tray():
    root.withdraw()
    # 后台运行托盘,不阻塞Tk主线程
    icon.run_detached()

# 绑定窗口关闭按钮逻辑
root.protocol("WM_DELETE_WINDOW", minimize_to_tray)
root.mainloop()

方案2:自定义图标点击回调

如果你需要更灵活的点击逻辑(比如区分左右键、双击动作等),可以手动绑定图标点击事件:

# 图标点击回调,必须接收icon、x、y、button、pressed五个参数
def on_tray_click(icon, x, y, button, pressed):
    # 只处理左键按下的事件
    if pressed and button == pystray.MouseButton.left:
        show_window()

# 菜单不需要加default参数
tray_menu = (
    pystray.MenuItem("显示", show_window),
    pystray.MenuItem("退出", quit_app)
)

# 创建图标后绑定点击事件
icon = pystray.Icon("app_name", tray_icon, "应用名称", tray_menu)
icon.on_click = on_tray_click

注意事项

  • 所有Tkinter的UI操作必须调度到主线程执行,不要在pystray的回调中直接操作窗口,用root.after(0, 回调函数)即可避免线程安全问题
  • 如果你使用的pystray版本低于0.19,没有run_detached()方法,可以用threading子线程启动托盘的run()方法。

内容的提问来源于stack exchange,提问作者Andre Lucato

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 08:24:10