【问题标题】:Tkinter simpledialog breaks pygame.mouse.get_focused()Tkinter simpledialog 中断 pygame.mouse.get_focused()
【发布时间】:2024-01-29 23:20:02
【问题描述】:

我正在编写一个将 Pygame 与 Tkinter 结合使用的程序。出于某种原因,显示 Tkinter 的简单对话之一会弄乱pygame.mouse.get_focused() 函数。我写了一个小程序来演示这个错误:

import tkinter as tk
from tkinter import simpledialog
import pygame

mainWindow = tk.Tk()

pygame.init()
screen = pygame.display.set_mode((500, 500))

while True:
  screen.fill(pygame.mouse.get_focused() * 16777215)

  pygame.display.update()
  mainWindow.update()

  for event in pygame.event.get():
    if event.type == pygame.MOUSEBUTTONDOWN:
      if event.button == pygame.BUTTON_LEFT:
        simpledialog.askstring(title="Test String", prompt="Gimme a string")

在使用任何简单的对话之前,这会按预期工作(当且仅当鼠标悬停在 Pygame 屏幕上时才会变白)。但是,在通过左键单击打开对话、关闭对话(通过输入文本或单击“取消”)并右键或中键单击 Pygame 屏幕后,将鼠标悬停在 any 程序的窗口,而不仅仅是 Pygame 之一。在这种损坏的状态下,当鼠标悬停在标题栏上时,Pygame 还认为鼠标悬停在其屏幕上,这是不应该的。

有趣的是,如果对话框以非点击方式打开(例如通过按键),则不会发生此行为。

TL;DR
Pygame 在按顺序执行以下操作后认为鼠标悬停在其屏幕上:

  1. 通过单击打开 Tkinter 简单对话框
  2. 关闭对话
  3. 在 Pygame 屏幕中单击而不打开对话框(右键或中键单击)
  4. 将鼠标悬停在 Tkinter 窗口上

【问题讨论】:

  • 我不能像你描述的那样失败,除非simpledialog 是打开的,这会阻塞 PyGame 事件循环。
  • 嗯,这很奇怪。我在 Windows 10 上使用最新版本的 Pygame (1.9.6) 和 Tkinter (8.6) 和 Python 3.8.2。我能够在另一台计算机上重现(也运行 Windows 10)。可能是操作系统问题? (此外,有人告诉我,目前尚不清楚该列表是否应该按顺序排列。我已将 TL;DR 更新为 clarift)

标签: python tkinter pygame


【解决方案1】:

看起来 Pygame 和 Tkinter 在操作系统的事件队列上存在分歧,因此除了 Pygame 和 Tkinter 的替代品之外,它不容易修复。

https://github.com/pygame/pygame/issues/1995

【讨论】: