Окна сообщений Tkinter, открытые из меню Pystray, отображаются несфокусированными или за другими окнами в Windows 11.Python

Программы на Python
Ответить
Anonymous
 Окна сообщений Tkinter, открытые из меню Pystray, отображаются несфокусированными или за другими окнами в Windows 11.

Сообщение Anonymous »

Я создаю настольное приложение Python, которое использует как pystray (для значка на панели задач), так и Tkinter (для окон сообщений и диалоговых окон). Все работает нормально, за исключением одной проблемы в Windows 11: когда я открываю tkinter.messagebox (или любое окно Tkinter) из обратного вызова меню pystray, окно появляется несфокусированным или позади других окон
Что я пробовал
  • Настройка 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»