Что я пробовал
- Настройка root.attributes("-topmost", True) и root.focus_force()
- Вызов root.lift() или root.after() для задержки фокуса
- Запуск Tk() в основном потоке
- Использование выделенного класса GuiDispatcher для маршалирования пользовательского интерфейса вызовы основного потока Tkinter
Информация о системе
- Windows 11 23H2
- Python 3.13
- pystray 0.19.5
- tkinter (стандарт)
- Это известное ограничение или ошибка Tkinter в Windows 11 при вызове из неосновных потоков?
- Есть ли рекомендации по объединению pystray и Tkinter в многопоточных приложениях?
import threading
import tkinter as tk
from tkinter import messagebox
import pystray
from PIL import Image, ImageDraw
def create_icon_image():
img = Image.new('RGB', (64, 64), (30, 144, 255))
d = ImageDraw.Draw(img)
d.rectangle([16, 16, 48, 48], fill=(255, 255, 255))
return img
def show_messagebox():
root = tk.Tk()
root.withdraw()
messagebox.showinfo("Test", "Window opened from tray menu", parent=root)
root.destroy()
def on_click(icon, item):
threading.Thread(target=show_messagebox, daemon=True).start()
icon = pystray.Icon(
"test_icon",
create_icon_image(),
"Test Tray",
menu=pystray.Menu(pystray.MenuItem("Show message", on_click))
)
icon.run()
Подробнее здесь: https://stackoverflow.com/questions/798 ... hind-other
Мобильная версия