Обновление и On_Draw Pyglet в теме - PullRequest
0 голосов
/ 12 марта 2019

Я хотел спросить, можно ли поместить функции 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?

...