1

属性として Pyglet ウィンドウを持つメイン オブジェクトがあります。Pylget のウィンドウ クラスには、プッシュ ハンドラーと呼ばれるメソッドがあり、これを使用してメソッドをイベント スタックにプッシュできます。次のコードが機能します。

import pyglet

class main:
    win = None
    gameItems = {}

    def __init__(self, window):
        self.win = window
        gameItem.win = self.win
        self.gameItems["menu"] = menu()
        self.gameItems["menu"].add()
        pyglet.app.run()

class gameItem:
    win = None

    def add(self):
        self.win.push_handlers(self)

class menu(gameItem): ##I actually have multiple objects inheriting from gameItem, this is just one of them.
    def on_mouse_press(self, x, y, button, modifier):
        '''on_mouse_press() is an accepted handler for the window object.'''
        print(x)
        print(y)

    def on_draw(self):
        '''With a quick draw function, so I can see immediately
        that the handlers are getting pushed.'''
        pyglet.graphics.draw(4, pyglet.gl.GL_QUADS, ('v2i', (256,350,772,350,772,450,256,450)))

m = main(pyglet.window.Window())

上記のコードは、デフォルト サイズで新しいウィンドウを生成し、on_mouse_press() および on_draw イベント ハンドラーをそれにアタッチします。それはうまく機能しますが、他のクラスで push_handlers() メソッドを呼び出そうとしても機能しないようです。

import pyglet

class Main:
    win = None
    gameItems = {}

    def __init__(self, window):
        self.win = window
        GameItem.game = self
        GameItem.win = self.win
        self.gameItems["main"] = MainMenu()
        pyglet.app.run()

    def menu(self):
        self.gameItems["main"].add()

class GameItem:
    win = None

    def add(self):
        self.win.push_handlers(self)

class MainMenu(GameItem): ##I actually have multiple objects inheriting from gameItem, this is just one of them.
    def on_mouse_press(self, x, y, button, modifier):
        '''on_mouse_press() is an accepted handler for the window object.'''
        print(x)
        print(y)

    def on_draw(self):
        '''With a quick draw function, so I can see immediately
        that the handlers are getting pushed.'''
        pyglet.graphics.draw(4, pyglet.gl.GL_QUADS, ('v2i', (256,350,772,350,772,450,256,450)))

m = Main(pyglet.window.Window(width=1024, height=768))
m.menu()

上記のコードは新しいウィンドウを生成しますが、メニュー クラスのハンドラをアタッチしません。これには理由がありますか、または使用できる回避策はありますか? ありがとう!

4

1 に答える 1

0

pyglet.app.run() を呼び出すと、pyglet ループに入り、pyglet ウィンドウが閉じられるまで戻ってこないため、pyglet ループが終了したときにのみ m.menu() が呼び出されます。Main から pyglet.app.run 行を削除して、次のように呼び出す場合:

m = Main(pyglet.window.Window(width=1024, height=768))
m.menu()
pyglet.app.run()
print "Window is closed now."

できます。

于 2013-06-08T18:52:46.680 に答える