So verwenden Sie das Windows -Systemmenü über Python und PygamePython

Python-Programme
Anonymous
 So verwenden Sie das Windows -Systemmenü über Python und Pygame

Post by Anonymous »

Ich habe ein ziemlich typisches Pygame -Projekt mit einer Spielschleife, die Ereignisse verarbeitet, Spielstatus und Daten aktualisiert und dann den nächsten Frame zeichnet. Das funktioniert alles. < /P>
Aus verschiedenen Gründen ist dies nur im Moment Windows. Also dachte ich, ich würde dem Windows -Systemmenü einen "About ..." -Screening hinzufügen (a.k.a. Fenstermenü /Steuermenü).

Code: Select all

WM_COMMAND = 0x0111
ABOUT_MENU_ID = 1001
hwnd = pygame.display.get_wm_info()["window"]
menu = ctypes.windll.user32.GetSystemMenu(hwnd, False)
ctypes.windll.user32.AppendMenuW(menu, 0, ABOUT_MENU_ID, "About...")
< /code>
Ich verstehe, dass PyGame keine Systemmeldungen erhält, daher muss ich Pygame.event.pump () verwenden. Meine vollständige Spielschleife lautet: < /p>
running = True
while running:
# Include system events.
pygame.event.pump()

if game.state == "playing":
if pygame.key.get_pressed()[pygame.K_a] or pygame.key.get_pressed()[pygame.K_LEFT]:
game.players[-1].move([-4, 0])
elif pygame.key.get_pressed()[pygame.K_d] or pygame.key.get_pressed()[pygame.K_RIGHT]:
game.players[-1].move([4, 0])

for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_ESCAPE:
running = False
elif event.key == pygame.K_SPACE:
game.players[-1].fire()
elif event.type == pygame.QUIT:
running = False
elif event.type == WM_COMMAND and event.wparam == ABOUT_MENU_ID:
handle_about_screen()
game.handleFrame()
elif game.state == "splash":
for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_ESCAPE:
running = False
if event.key == pygame.K_p:
game.__init__()
elif event.type == pygame.QUIT:
running = False
elif event.type == WM_COMMAND and event.wparam == ABOUT_MENU_ID:
handle_about_screen()
elif game.state == "about":
for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_ESCAPE:
running = False
if event.key == pygame.K_p:
if(game.lastState == "splash"):
handle_splash_screen()
elif event.type == pygame.QUIT:
running = False

pygame.display.update()
clock.tick(game.frame_rate)
< /code>
handle_about_screen () wird nie aufgerufen. Wenn die Ereignismeldung sie zum PyGame erfolgt, wird sie nicht korrekt identifiziert. Aber Sie können die unendliche Schleife im Code unten sehen ... Ich konnte keinen Weg finden, um bei meinem Überblick über Bildschirm-Menüelemente zu kommen, ohne entweder eine offensichtliche unendliche Schleife zu haben, oder ohne potenziell wichtige Nachrichten zu werfen, die ich nicht bearbeite, oder mit der Reihenfolge der Ereignisse, die ich nicht veranlasste, nicht: < /p>
krabbelnwhile True:
msg = ctypes.windll.user32.PeekMessageW(None, None, 0, 0, 1)  # Check without removing (to avoid deleting other events)
if not msg:
break  # No events found

if msg[0] == WM_COMMAND and msg[1] == ABOUT_MENU_ID:
handle_about_screen()  # It's ours...
ctypes.windll.user32.PeekMessageW(None, None, 0, 0, 0)  # Remove the "About" menu message from the queue

else:
break  # It's an event we don't handle... But now we're
#   infinite looping because we will find this one again.
Dies scheint einfach zu sein ... fehlt mir eine offensichtliche API-, Pygame- oder Python -Funktionalität?>

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post