python - Hvordan kører jeg pyglet.window.clear funktionen via en on\_button\_press begivenhed?

Indlæg af Hanne Mølgaard Plasc

Problem



Lang historie kort Jeg laver et tekstbaseret spil i python 3 ved hjælp af Pyglet og jeg har problemer med at rydde vinduet. Jeg ønsker at rydde alt ud, så jeg kan sætte nye ord og nye billeder ind. Jeg håbede at sætte det op som sådan:


@window.event
def on\_key\_press(key.escape,modifier)
    window.clear


Eller noget i den retning, men det synes ikke at arbejde. Har nogen nogen forslag, ideer? Den eneste anden ide ville være at konvertere ordene til sort og billeder til sort og lagre det op, men så vil vinduet stadig være at læse de ting og jeg kunne se som spillet fortsætter, det begynder at spise mere og mere ram at køre vinduet med det at indlæse alle de tidligere billeder og tekst.


Jeg foretrækker at undgå det og bare rydde det ud, også da skal jeg ikke kopiere den samme kode igen og igen og gøre det sort.


Tak,
 Ben

Bedste reference


import pyglet
from pyglet.gl import *

from time import time # Used for FPS calc

key = pyglet.window.key

class main(pyglet.window.Window):
    def \_\_init\_\_ (self):
        super(main, self).\_\_init\_\_(800, 800, fullscreen = False, vsync = True)

        self.running = True

        self.fps\_counter = 0
        self.last\_fps = time()
        self.fps\_text = pyglet.text.Label(str(self.fps\_counter), font\_size=12, x=10, y=10)

    def on\_key\_press(self, symbol, modifiers):
        if symbol == key.ESCAPE: # [ESC]
            self.running = False
        else:
            self.clear() # However, this is done in the render() logic anyway.

    def on\_draw(self):
        self.render()

    def render(self):
        self.clear()

        # And flip the GL buffer
        self.fps\_counter += 1
        if time() - self.last\_fps > 1:
            self.fps\_text.text = str(self.fps\_counter)
            self.fps\_counter = 0
            self.last\_fps = time()

        self.fps\_text.draw()

        self.flip()

    def run(self):
        while self.running is True:
            self.render()

            # -----------> This is key <----------
            # This is what replaces pyglet.app.run()
            # but is required for the GUI to not freeze
            #
            event = self.dispatch\_events()
            if event and event.type == pygame.QUIT:
                self.running = False

x = main()
x.run()


Dette er en hurtig og beskidt kopi og indsæt logik af en FPS-tæller mod en sort skærm.

Hver nøgle-tryk vil tvinge en klar af skærmen.


I dit eksempel gemmer du sandsynligvis pyglet.window.Window() som myWindow = py... eller noget lignende. Og på den globale variabel du 'd ring myWindow.clear() fra din dekoratør.


import pyglet
myWindow = pyglet.window.Window()

@myWindow.event
def on\_key\_press(symbol, modifier):
    myWindow.clear()

pyglet.all.run()


(Du manglede en : i slutningen, key.escape skal bare være en variabel, og clear er en funktion, der ikke er en variabel.)


Men hvis du vil fortsætte med at skrive store grafiske applikationer, foreslår jeg stærkt, at du klassificerer din kode og gør den 'OOP' lige uden for flagermuset, men grafiske biblioteker har tendens til at blive rodet snarere hurtigt.