Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python pyglet on_draw事件停止,直到鼠标移动_Python_Pyglet - Fatal编程技术网

Python pyglet on_draw事件停止,直到鼠标移动

Python pyglet on_draw事件停止,直到鼠标移动,python,pyglet,Python,Pyglet,我正试图写我的第一部pyglet动画,但我遇到了一个问题 我有一个从绘图上的函数调用的更新函数。它做它应该做的,但它在循环的任意位置停止。 如果我开始移动鼠标,它将继续沿着循环移动 我看到2011年这里有一个关于同一个问题的问题,但没有相关的答案:() 为了工作,我需要继续调用on_draw中的update函数 这是两个功能的代码: def update(zd): stripe.y += zd[0] stripe._set_rotation(zd[0]) @window.eve

我正试图写我的第一部pyglet动画,但我遇到了一个问题

我有一个从绘图上的
函数调用的更新函数。它做它应该做的,但它在循环的任意位置停止。
如果我开始移动鼠标,它将继续沿着循环移动

我看到2011年这里有一个关于同一个问题的问题,但没有相关的答案:()

为了工作,我需要继续调用on_draw中的update函数

这是两个功能的代码:

def update(zd):
    stripe.y += zd[0]
    stripe._set_rotation(zd[0])

@window.event
def on_draw():
    window.clear()
    window.clear()
    batch.draw()
    try:
        update(next(calc))
    except:
        pass

我在calc函数中通过大量计算从一个大循环获得zd到更新。这里,请尝试以下代码:

import pyglet
from pyglet.gl import *
from math import radians, cos, sin, degrees, atan2
from time import time

glEnable(GL_BLEND)
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
glEnable(GL_LINE_SMOOTH)
glHint(GL_LINE_SMOOTH_HINT, GL_DONT_CARE)
pyglet.options['audio'] = ('alsa', 'openal', 'silent')
key = pyglet.window.key

class GUI(pyglet.window.Window):
    def __init__(self):
        super(GUI, self).__init__(640,340, caption='My app')
        self.alive = True
        self.keys_down = {}

        imgTexture = pyglet.image.load('/path/to/image.png')
        self.myImage = pyglet.sprite.Sprite(imgTexture)
        self.myImage.x, self.myImage.y = 10, 50 # x,y from bottom left corner

    def render(self, *args):
        pyglet.gl.glClearColor(1, 1, 1, 1)
        self.clear()
        # .. This is where you draw your objects, for instance
        self.myImage.draw()
        self.flip()

    def on_draw(self):
        self.render()

    def on_close(self):
        self.alive = False

    def on_key_press(self, symbol, modkey):
        self.keys_down[symbol] = time()

    def on_key_release(self, symbol, modkey):
        if symbol in self.keys_down:
            del(self.keys_down[symbol])

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

    def on_mouse_press(self, x, y, button, modifiers):
        print(button,'pressed',(x,y))


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

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

    def run(self):
        while self.alive:
            event = self.dispatch_events()

            for symbol in self.keys_down:
                if symbol == key.ESCAPE:
                    self.alive = None
                    break
                elif symbol == key.LEFT:
                    pass #Arrowkey Left
                elif symbol == key.RIGHT:
                    pass #Arrowkey Right
                elif symbol == key.UP:
                    pass #Arrowkey Up
                elif symbol == key.DOWN:
                    pass #Arrowkey Down
                elif symbol == 65515:
                    pass # Win key
                else:
                    print(symbol)
            self.render()


if __name__ == '__main__':
    x = GUI()
    pyglet.clock.set_fps_limit(120)
    x.run()
请注意,在此代码中从未真正调用on_draw()。
在传统的pyglet代码中,只有在事件存在时才会调用_draw()上的
,通常使用计时器或其他计划的事件触发这些事件。。移动鼠标就是这样一个事件。

这是对您习惯的传统
app.run()
的手动覆盖。
所以这里的两个主要功能是:

  • event=self.dispatch\u events()
  • self.render()
  • 第一个从pyglet获取任何事件,有效地释放了所有锁,因为即使是空事件也必须获取。 第二个是渲染函数,这是_draw()
    上的
    通常所做的,除非我们现在可以随时(或随时)调用它

    我不是专家,但这适用于99%的任何GUI制作,只要你不打算做大型3D游戏,这将为你做的工作