Сделайте что-нибудь, пока кнопка нажата в Python Pyglet - PullRequest
0 голосов
/ 04 марта 2019
@win.event
def on_key_press(key, modifiers):
    if key == pyglet.window.key.UP:
        print("UP")

Эта функция печатает UP только один раз, но я хочу печатать UP, пока я удерживаю кнопку UP.

1 Ответ

0 голосов
/ 04 марта 2019

Эту проверку необходимо выполнить за пределами on_key_press.
, поскольку эта функция является функцией однократного срабатывания, которая вызывается только при срабатывании события нажатия кнопки ВНИЗ.И этот триггер выполняется только один раз из операционной системы.

Таким образом, вам нужно сохранить состояние DOWN (on_key_press) и сохранить нажатую клавишу в переменной, где (ниже я называю это self.keys) .
Впоследствии вам также необходимо позаботиться о любых RELEASE событиях, что в моем примере ниже сделано в on_key_release.

Вот как все это может быть связано:

from pyglet import *
from pyglet.gl import *

key = pyglet.window.key

class main(pyglet.window.Window):
    def __init__ (self, width=800, height=600, fps=False, *args, **kwargs):
        super(main, self).__init__(width, height, *args, **kwargs)

        self.keys = {}

        self.alive = 1

    def on_draw(self):
        self.render()

    def on_close(self):
        self.alive = 0

    def on_key_release(self, symbol, modifiers):
        try:
            del self.keys[symbol]
        except:
            pass

    def on_key_press(self, symbol, modifiers):
        if symbol == key.ESCAPE: # [ESC]
            self.alive = 0

        self.keys[symbol] = True

    def render(self):
        self.clear()

        ## Add stuff you want to render here.
        ## Preferably in the form of a batch.

        self.flip()

    def run(self):
        while self.alive == 1:
            # -----------> This is key <----------
            # This is what replaces pyglet.app.run()
            # but is required for the GUI to not freeze
            #
            event = self.dispatch_events()

            if key.UP in self.keys:
                print('Still holding UP')
            self.render()

if __name__ == '__main__':
    x = main()
    x.run()
...