Pyglet работает, но не отвечает на команды esc - PullRequest
0 голосов
/ 04 июня 2018

Я относительно новичок в Python и Pyglet, я пытаюсь создать приложение, которое динамически отображает фотографии в соответствии с идентификатором команды, отправленной через последовательный порт.Вот мой код:

import pyglet
from pyglet import clock
import serial
import json
import os

base_dir = 'data'
data = []
currentDatum = ''

def initialiseData():
    global data
    #load the json
    with open('dataset.json') as f:
        data = json.load(f)
    #for every file in the json load the image
    for d in data:
        d['media'] = pyglet.image.load(os.path.join(base_dir, d['name']))

    print("Scan a tag")

def readSerial(dt):
    global currentDatum
    tag = ser.readline()
    tag = tag.strip()
    for d in data:
        if d['id'] == tag:
            currentDatum = d
            print(currentDatum)



ser = serial.Serial('/dev/cu.usbmodem1421', 9600)

initialiseData()

window = pyglet.window.Window(1000, 800, resizable = True)


@window.event
def on_draw():
    window.clear()
    currentDatum['media'].anchor_x = currentDatum['media'].width/2 - window.width/2
    currentDatum['media'].anchor_y = currentDatum['media'].height/2 - window.height/2
    currentDatum['media'].blit(0, 0)


clock.schedule(readSerial)
pyglet.app.run()

Приложение работает нормально, в том смысле, что оно загружает данные от сына, и когда я отправляю серийный идентификатор, оно мгновенно читается, но каждое взаимодействие с мышью останавливает приложение:Я не могу закрыть окно, не могу изменить его размер, оно просто застревает.Любой совет?

1 Ответ

0 голосов
/ 05 июня 2018

Понятия не имею, что на самом деле делает программа или как ее использовать.А поскольку я не могу воспроизвести вашу среду (например, у вас есть usb-модем), я постараюсь сделать лучший подход к универсальному решению, которое должно работать и планировать дальнейшее развитие вашего проекта:

import pyglet
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.x, self.y = 0, 0

        self.batch = pyglet.graphics.Batch()
        self.data = []
        self.currentDatum = ''
        self.ser = serial.Serial('/dev/cu.usbmodem1421', 9600)

        self.initialiseData()

        pyglet.clock.schedule(self.readSerial)

        self.alive = 1

    def on_draw(self):
        self.render()

    def on_close(self):
        self.alive = 0

    def on_mouse_motion(self, x, y, dx, dy):
        pass

    def on_mouse_release(self, x, y, button, modifiers):
        pass

    def on_mouse_press(self, x, y, button, modifiers):
        pass

    def on_mouse_drag(self, x, y, dx, dy, button, modifiers):
        pass

    def on_key_release(self, symbol, modifiers):
        pass

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

    def render(self):
        self.clear()

        # For future reference, use batches:
        self.batch.draw()
        # But this is how it's implemented atm:
        self.currentDatum['media'].anchor_x = self.currentDatum['media'].width/2 - self.width/2
        self.currentDatum['media'].anchor_y = self.currentDatum['media'].height/2 - self.height/2
        self.currentDatum['media'].blit(0, 0)

        self.flip()

    def initialiseData(self):
        #load the json
        with open('dataset.json') as f:
            self.data = json.load(f)
        #for every file in the json load the image
        for d in self.data:
            d['media'] = pyglet.image.load(os.path.join(base_dir, d['name']))

        print("Scan a tag")

    def readSerial(self, dt):
        tag = self.ser.readline()
        tag = tag.strip()
        for d in self.data:
            if d['id'] == tag:
                self.currentDatum = d
                print(self.currentDatum)

    def run(self):
        while self.alive == 1:
            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 __name__ == '__main__':
    x = main()
    x.run()

В этом коде обязательно должно быть несколько ошибок времени выполнения, синтаксис которых я мог испортить.Но я перенес как можно больше вашего кода в объектно-ориентированное мышление.Также известный как класс, который наследует класс Window, чтобы вы могли изменять элементы внутри него и само окно.

Есть также некоторые функции-заполнители, которые вы можете использовать для обработки событий мыши и клавиатуры.Они наследуются / перекрываются классом pyglet.window.Window.Таким образом, в этот класс может быть помещена любая функция, поддерживаемая Window.

Существует также пользовательский pyglet.app.run(), который обрабатывает опрос событий, гарантируя, что вы не застряли на клавиатуре, мыши или в окне (измените размер, переместить и т.д.) события.

Надеюсь, что это работает.

...