Я хотел спросить, можно ли поместить функции Update и On_Draw класса Pyglet, созданного пользователем, в поток? Позволь мне объяснить. У меня есть класс моего приложения Pyglet, в котором мне нужны некоторые функции (всегда одного и того же класса), которые работают одновременно с функциями Update и On_Draw. Теперь я осмотрелся, и единственное, что я обнаружил, - это вставить все приложение Pyglet в основной поток, но это создаст проблемы для самого Pyglet. Мне просто нужно, чтобы эти две функции были в одном основном потоке, а другие - во вторичных. Это возможно сделать?
EDIT:
С помощью нескольких попыток, так как я впервые использую потоки, мне удалось собрать работающий скрипт.
from pyglet.gl import *
from pyglet.window import FPSDisplay
import threading, time, os
FPS = 120.0
class test(pyglet.window.Window):
loop = True
th = True
load = 10
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.__video_set()
self.label = pyglet.text.Label(('LOADING: '+str((self.load-10)//10)+"%"), font_name='Times New Roman', font_size=36)
self.label.x = self.width // 2
self.label.y = self.height // 2 + 200
self.thread = threading.Thread(target=self.loader)
self.thread.start()
def loader(self):
time.sleep(1)
while self.loop is True:
time.sleep(0.05)
if self.load >= 1010:
self.loop = False
else:
self.load += 1
def on_draw(self):
self.clear()
self.bar = pyglet.graphics.draw(2, pyglet.gl.GL_LINES, ('v2i', (10, 250, int(self.load), 250)))
self.bar = pyglet.gl.glLineWidth(20)
if self.load >= 15:
self.label.draw()
def update(self, dt):
if self.load >= 1010:
self.label.text = ("LOADING COMPLETE")
else:
self.label.text = ("LOADING: "+str((self.load-10)//10)+"%")
def on_close(self):
self.close()
os._exit(0)
def __video_set(self):
self.__platform = pyglet.window.get_platform()
self.__default_display = self.__platform.get_default_display()
self.__default_screen = self.__default_display.get_default_screen()
self.__default_dimension_screen = 1024, 576
self.set_size(self.__default_dimension_screen[0], self.__default_dimension_screen[1])
self.location = self.__default_screen.width // 2 - self.__default_dimension_screen[0] // 2, self.__default_screen.height // 2 - self.__default_dimension_screen[1] // 2
self.set_location(self.location[0], self.location[1])
if __name__ == "__main__":
ts = test()
pyglet.clock.schedule_interval(ts.update, 1 / FPS)
pyglet.app.run()
Этот скрипт имитирует начальную загрузку с полосой загрузки и процентом, показывающим загрузку. Открывается поток, в котором есть цикл while
, который имитирует загрузку, и каждый раз, когда он повторяется, он изменяет переменную self.load
. Так как это первый раз, когда я получаю в руки темы, правильно ли я проделал работу? Кроме того, я хотел бы спросить, в функции потока я был вынужден вставить два time.sleep
. Это связано с тем, что независимо от того, где я его поместил, в функции __init__
, в функции update
или другой функции, поток был слишком быстрым и заканчивался либо до того, как окно было создано, либо полоса загрузки изменилась с 0 на 100 менее чем за секунду. Есть ли решение без использования time.sleep
?