【发布时间】: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 在按顺序执行以下操作后认为鼠标悬停在其屏幕上:
- 通过单击打开 Tkinter 简单对话框
- 关闭对话
- 在 Pygame 屏幕中单击而不打开对话框(右键或中键单击)
- 将鼠标悬停在 Tkinter 窗口上
【问题讨论】:
-
我不能像你描述的那样失败,除非
simpledialog是打开的,这会阻塞 PyGame 事件循环。 -
嗯,这很奇怪。我在 Windows 10 上使用最新版本的 Pygame (1.9.6) 和 Tkinter (8.6) 和 Python 3.8.2。我能够在另一台计算机上重现(也运行 Windows 10)。可能是操作系统问题? (此外,有人告诉我,目前尚不清楚该列表是否应该按顺序排列。我已将 TL;DR 更新为 clarift)