如何通过on_button_press事件运行pyglet.window.clear函数?

时间:2017-01-29 17:46:28

标签: python windows window pyglet

长话短说我正在使用Pyglet在python 3中制作基于文本的游戏,我无法清除窗口。我想清除所有内容,这样我就可以放入新词和新图片了。我希望能像这样设置它:

@window.event
def on_key_press(key.escape,modifier)
    window.clear

或者沿着这些方向的东西,但它似乎不起作用。有没有人有任何建议,想法?唯一的另一个想法是将单词转换为黑色,将任何图像转换为黑色并将其分层,但随后窗口仍将加载那些东西,我可以看到随着游戏的继续,它开始吃掉越来越多的ram来运行带有它的窗口加载所有以前的图片和文字。

我宁愿避免这种情况,只是将其清除,然后我也不必一遍又一遍地复制相同的代码使其变黑。

谢谢,  本

1 个答案:

答案 0 :(得分:1)

import pyglet
from pyglet.gl import *

from time import time # Used for FPS calc

key = pyglet.window.key

class main(pyglet.window.Window):
    def __init__ (self):
        super(main, self).__init__(800, 800, fullscreen = False, vsync = True)

        self.running = True

        self.fps_counter = 0
        self.last_fps = time()
        self.fps_text = pyglet.text.Label(str(self.fps_counter), font_size=12, x=10, y=10)

    def on_key_press(self, symbol, modifiers):
        if symbol == key.ESCAPE: # [ESC]
            self.running = False
        else:
            self.clear() # However, this is done in the render() logic anyway.

    def on_draw(self):
        self.render()

    def render(self):
        self.clear()

        # And flip the GL buffer
        self.fps_counter += 1
        if time() - self.last_fps > 1:
            self.fps_text.text = str(self.fps_counter)
            self.fps_counter = 0
            self.last_fps = time()

        self.fps_text.draw()

        self.flip()

    def run(self):
        while self.running is True:
            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 event and event.type == pygame.QUIT:
                self.running = False

x = main()
x.run()

这是FPS计数器对黑屏的快速而脏的复制和粘贴逻辑 每次按键都会强行清除屏幕。

在您的示例中,您可能会将pyglet.window.Window()存储为myWindow = py...或类似的内容。在这个全局变量上,您可以从装饰器中调用myWindow.clear()

import pyglet
myWindow = pyglet.window.Window()

@myWindow.event
def on_key_press(symbol, modifier):
    myWindow.clear()

pyglet.all.run()

(最后你没有:key.escape应该只是一个变量而clear是一个函数而不是一个变量。)

但是,如果您要继续编写大型图形应用程序,我强烈建议您对代码进行分类并使其成为&#34; OOP&#34;蝙蝠,图形库往往会变得凌乱,否则很快。