Ubuntu 中的系统托盘(适用于 Python)

在我使用Ubuntu中,尤其是系统托盘我们通常用于显示应用程序的图标和通知。如果我们想在Python中创建一个系统托盘应用程序,则可以使用第三方库pystray来实现。但是大多数人不清楚如何实现Python TKINTER 将程序放在系统托盘中,下面的具体案例可以看看。

1、问题背景

在 Ubuntu 9.04 中,我想使用 Python TKINTER 将程序放在系统托盘中,但我不知道如何实现。

2、解决方案

  • 由于 Tkinter 无法实现此功能,因此需要使用 gtk 库。

  • 以下是一个在 Ubuntu 论坛上找到的示例,它使用了 gtk 库和 Tkinter:

python 复制代码
import gtk
import Tkinter as tk

def main():
    window = tk.Tk()
    window.title("Example")

    # Create a gtk status icon
    status_icon = gtk.StatusIcon()
    status_icon.set_icon_from_file("icon.png")
    status_icon.set_tooltip("Example Tooltip")

    # Connect the status icon to the window
    status_icon.connect("activate", window.deiconify)
    status_icon.connect("popup-menu", window.show_menu)

    # Create a menu for the status icon
    menu = gtk.Menu()
    menu_item = gtk.MenuItem("Show Window")
    menu_item.connect("activate", window.deiconify)
    menu.append(menu_item)
    menu_item = gtk.MenuItem("Quit")
    menu_item.connect("activate", gtk.main_quit)
    menu.append(menu_item)

    status_icon.set_menu(menu)

    # Show the window
    window.mainloop()

if __name__ == "__main__":
    main()
  • 对于 Ubuntu 10.04+,则需要使用 AppIndicator。

  • 以下是一个在 Ubuntu Wiki 上找到的 Python 示例,它使用了 AppIndicator:

python 复制代码
import appindicator

def main():
    # Create an AppIndicator instance
    indicator = appindicator.Indicator("example", "icon.png", appindicator.CATEGORY_APPLICATION_STATUS)

    # Set the tooltip for the AppIndicator
    indicator.set_status(appindicator.STATUS_ACTIVE)
    indicator.set_menu(menu)

    # Show the AppIndicator
    indicator.show()

    # Create a menu for the AppIndicator
    menu = gtk.Menu()
    menu_item = gtk.MenuItem("Show Window")
    menu_item.connect("activate", window.deiconify)
    menu.append(menu_item)
    menu_item = gtk.MenuItem("Quit")
    menu_item.connect("activate", gtk.main_quit)
    menu.append(menu_item)

if __name__ == "__main__":
    main()
  • 此外,还可以使用 X11 方法来实现此功能,但这需要使用 ctypes 库。

  • 以下是一个示例:

python 复制代码
import ctypes

def main():
    # Get the X11 display
    display = ctypes.cdll.LoadLibrary("libX11.so.6")

    # Get the root window
    root_window = display.XDefaultRootWindow(display.XOpenDisplay(None))

    # Create a window for the tray icon
    tray_window = display.XCreateSimpleWindow(display.XOpenDisplay(None), root_window, 0, 0, 1, 1, 0, 0, 0)

    # Set the tray icon
    display.XSetIconName(display.XOpenDisplay(None), tray_window, "icon.png")

    # Show the tray icon
    display.XMapWindow(display.XOpenDisplay(None), tray_window)

    # Create a menu for the tray icon
    menu = gtk.Menu()
    menu_item = gtk.MenuItem("Show Window")
    menu_item.connect("activate", window.deiconify)
    menu.append(menu_item)
    menu_item = gtk.MenuItem("Quit")
    menu_item.connect("activate", gtk.main_quit)
    menu.append(menu_item)

    # Show the menu
    display.XSetTransientForHint(display.XOpenDisplay(None), menu.window.xid, tray_window)
    display.XGrabPointer(display.XOpenDisplay(None), menu.window.xid, True, 0, 0, 0, 0, 0)
    display.XMapRaised(display.XOpenDisplay(None), menu.window.xid)

if __name__ == "__main__":
    main()

从上面的代码我们得知,我们需要将icon.png替换为你自己的图标文件。然后定义了一个点击事件on_clicked,当点击托盘图标时会触发该事件。最后创建了一个托盘应用程序并运行。

我们可以根据自己的需求添加更多的菜单项和事件处理函数来扩展这个示例。希望这可以帮助大家在Ubuntu中创建一个系统托盘应用程序。

相关推荐
_运维那些事儿19 小时前
VM环境的CI/CD
linux·运维·网络·阿里云·ci/cd·docker·云计算
云小逸19 小时前
【nmap源码学习】 Nmap网络扫描工具深度解析:从基础参数到核心扫描逻辑
网络·数据库·学习
肉包_51120 小时前
两个数据库互锁,用全局变量互锁会偶发软件卡死
开发语言·数据库·c++
喵手20 小时前
Python爬虫实战:HTTP缓存系统深度实战 — ETag、Last-Modified与requests-cache完全指南(附SQLite持久化存储)!
爬虫·python·爬虫实战·http缓存·etag·零基础python爬虫教学·requests-cache
喵手20 小时前
Python爬虫实战:容器化与定时调度实战 - Docker + Cron + 日志轮转 + 失败重试完整方案(附CSV导出 + SQLite持久化存储)!
爬虫·python·爬虫实战·容器化·零基础python爬虫教学·csv导出·定时调度
霖霖总总20 小时前
[小技巧64]深入解析 MySQL InnoDB 的 Checkpoint 机制:原理、类型与调优
数据库·mysql
2601_9491465320 小时前
Python语音通知接口接入教程:开发者快速集成AI语音API的脚本实现
人工智能·python·语音识别
寻梦csdn20 小时前
pycharm+miniconda兼容问题
ide·python·pycharm·conda
Trouvaille ~20 小时前
【Linux】UDP Socket编程实战(一):Echo Server从零到一
linux·运维·服务器·网络·c++·websocket·udp
嵌入小生00721 小时前
Shell | 命令、编程及Linux操作系统的基本概念
linux·运维·服务器