Как изменить фокус на окно pygame?

#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()