2

私はpygameベースのビデオプレーヤーを持っています、それはGUIに使用されるバークリウムブラウザを持っています、その下にストリームを再生するためのVLCライブラリがあります。プレーヤーを作成しませんでしたが、現在存在しない「サイズ変更」オプションを追加したいと思います。アプリケーションはOSX用に作られています。

プレーヤーの初期化pygame.set_mode(screensize,OPENGL|DOUBLEBUF|RESIZABLE)時に、が呼び出されます。問題は、ウィンドウのサイズを画面サイズより大きくすると、これらの部分が表示されない(バグが表示される)pygame.set_modeことです。再試行すると、依存関係(ブラウザーとVLC)が原因でアプリがクラッシュします。 )。

そこで、以下を使用して画面を初期化することにしました。

pygame.set_mode(screenresolution, OPENGL|DOUBLEBUF|RESIZABLE)

これで最大に設定してから、元の小さい解像度に戻す必要があります(マウスでサイズ変更するなど)。

どうやってするか?RESIZABLE旗とマウスの移動アクションをシミュレートする方法は?

プレーヤーは小さいサイズにうまくサイズ変更できます。問題になるのは大きいサイズだけです。

class InputAndDisplay:
    def init(self, fullscreen=False):
        global pygame, sys
        # if 'darwin' in sys.platform:
        #     import sys
        #     sys.argv = ['Core.py']
        #     import pygame.macosx
        #     pygame.macosx.init()

        pygame.init()

        global screenSize
        self.screenSize = screenSize
        if fullscreen:
            try: self.screenSize = pygame.display.list_modes()[0]
            except Exception, e: print e
            flags = OPENGL|DOUBLEBUF|FULLSCREEN
        else:
            flags = RESIZABLE|OPENGL|DOUBLEBUF

        print 'screenSize:', self.screenSize

        try:
            povrsina = pygame.display.set_mode(self.screenSize, flags)
        except Exception, e:
            print e
            self.screenSize = screenSize
            povrsina = pygame.display.set_mode(self.screenSize, RESIZABLE|OPENGL|DOUBLEBUF)
        pygame.display.set_caption('NetTVBox-WebPlayer')

        pygame.mouse.set_pos(list(self.screenSize))
        if 'darwin' not in sys.platform:
            pygame.mouse.set_visible(False)

        #pygame.key.set_repeat(300, 100)

        if 'darwin' not in sys.platform:
            pygame.mixer.quit()

        if 'linux' in sys.platform: # try to turn off vsyncing
            import ctypes
            libgl = ctypes.cdll.LoadLibrary('libGL.so.1')
            proc = libgl.glXGetProcAddressARB('glXSwapIntervalMESA')
            _glXSwapIntervalMESA = ctypes.CFUNCTYPE(ctypes.c_int, ctypes.c_int)(proc)
            _glXSwapIntervalMESA(0)

        glMatrixMode(GL_PROJECTION)
        glLoadIdentity()
        #gluPerspective(45.0, 640/480.0, 0.1, 100.0)
        glOrtho(-0.5, 0.5, -0.5, 0.5, -5, 5)
        #glTranslatef(0.0, 0.0, -3.0)
        #glRotatef(25, 1, 0, 0)

        glMatrixMode(GL_MODELVIEW)
        glLoadIdentity()

        glEnable(GL_TEXTURE_2D)
        glShadeModel(GL_FLAT)
        glClearColor(0.0, 0.0, 0.0, 0.0)
        glClearDepth(1.0)
        glEnable(GL_DEPTH_TEST)
        glDepthFunc(GL_LEQUAL)
        glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST)

        self.textures = glGenTextures(2)

        self.threeDmode = MODE_3D_OFF

それはそこにあり ますそしてメインファイルはそれを呼び出すものですinit、そして他の多くのものも同様です。そのため、ここにすべてのコードを配置しませんでした。多くのコードがあり、すべてが重要というわけではありません。 ここに一部があります。inputAndDisplay.py
Core.py
Core.py

input_and_display = InputAndDisplay()
input_and_display.init(self.fullscreen)
rc = RemoteControl()
rc.init()
media = Media()
if 1: # !
    media.config = {
        'buffering': state.mediaplayer_buffering,
        'contrast': state.mediaplayer_contrast,
        'saturation': state.mediaplayer_saturation,
    }
media.init()
browser = Browser()
browser.init()

助けてくれてありがとう

4

1 に答える 1

0

VIDEORESIZEサイズ変更を検出するイベントが欠落しているようです。

(関連イベントを参照VIDEOEXPOSE: ACTIVEEVENT http://www.pygame.org/docs/ref/event.html )

http://www.pygame.org/docs/ref/display.html#pygame.display.set_mode

" 次に、表示モードが設定され、いくつかのイベントが pygame イベント キューに配置されます。ユーザーがプログラムのシャットダウンを要求すると、 pygame.QUITが送信されます。ウィンドウは、表示が入力フォーカスを得たり失ったりすると、pygame.ACTIVEEVENTイベントを受け取ります。ディスプレイが pygame.RESIZABLE フラグで設定されている場合、ユーザーがウィンドウのサイズを調整するとpygame.VIDEORESIZEイベントが送信されます. 画面に直接描画するハードウェア ディスプレイは、ウィンドウの一部を再描画する必要がある場合にpygame.VIDEOEXPOSEイベントを取得します. "

于 2012-09-12T06:31:00.937 に答える