Понятия не имею, что на самом деле делает программа или как ее использовать.А поскольку я не могу воспроизвести вашу среду (например, у вас есть 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()
, который обрабатывает опрос событий, гарантируя, что вы не застряли на клавиатуре, мыши или в окне (измените размер, переместить и т.д.) события.
Надеюсь, что это работает.