#python #pygame #focus
#python #pygame #фокус
Вопрос:
Я пытаюсь создать игру, pygame
в конце которой tkinter
появляется сообщение о завершении игры и возможность сыграть снова.
Когда я нажимаю кнопку «воспроизвести снова», спрайт проигрывателя вообще не перемещается при нажатии клавиши.
И затем я обнаружил, что это происходило потому, что после того, как я нажал на кнопку окна сообщения, оно не меняло фокус на активное pygame
окно.
Было бы полезно, если бы кто-нибудь мог сказать мне, как я могу изменить окно фокусировки.
Комментарии:
1. Если вы пытаетесь создать игру поверх экрана, я бы рекомендовал делать это в том же окне, что и ваш цикл pygame, а не использовать tkinter для создания отдельного окна
2. Вы импортируете внешний скрипт на python, который имеет
messagebox
и отображает его, или вы создаете его внутри своегоpygame
скрипта, и там также довольно много вопросов по этому поводу, взгляните на них тоже3. Обязательно вызовите
root.quit()
в tkinter, чтобы выйти из цикла. Где находится фокус после закрытия окна сообщения?4. @Mike67 это снова фокусируется на моем текстовом редакторе Sublime Text
5. @CoolCloud Я увижу это и попробую еще раз
Ответ №1:
Если вы используете Windows, вы можете использовать win32gui
модуль и, в частности, SetFocus()
метод.
Например, приведенная ниже программа, вдохновленная этой страницей, создает tkinter
окно и еще pygame
окошко и выводит их на передний план поочередно.
# -------------------------------
# initialise the front() function
import win32gui
def windowEnumerationHandler(hwnd, windows):
windows.append((hwnd, win32gui.GetWindowText(hwnd)))
results = []
windows = []
win32gui.EnumWindows(windowEnumerationHandler, windows)
def front(win_name):
for i in windows:
if i[1] == win_name:
win32gui.ShowWindow(i[0],5)
win32gui.SetForegroundWindow(i[0])
break
# ------------------------
# create the pygame window
import pygame
class PygameWindow:
def __init__(self, name):
self.name = name
self.window = pygame.display.set_mode((640, 480))
pygame.display.set_caption(self.name)
def to_front(self):
front(self.name)
pygame_window = PygameWindow('This is the pygame window')
# -------------------------
# create the tkinter window
import tkinter
class TkinterWindow:
def __init__(self, name):
self.name = name
self.window = tkinter.Tk()
self.window.title(self.name)
def to_front(self):
front(self.name)
tkinter_window = TkinterWindow('This is the tkinter window')
# ------------------------------------------
# main loop - switch between the two windows
from time import sleep
while True:
sleep(1)
pygame_window.to_front()
sleep(1)
tkinter_window.to_front()
# update the tkinter window to make it to stay visible
tkinter_window.window.update()