2012-08-16 197 views
2

我有基於pygame的視頻播放器,它具有用於GUI的berkelium瀏覽器, 下面是用於播放流的VLC庫。我沒有製作播放器,但我想 喜歡添加一個「調整大小」選項,目前不存在。 該應用程序是爲OS X調整視頻播放器的大小

在播放器的初始化製成,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 

這是在inputAndDisplay.py
init及主要文件是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() 

在此先感謝您的幫助

+0

份額最好的初始化部分。 – iKlsR 2012-08-16 18:08:54

回答

0

這聽起來像你」重新丟失VIDEORESIZE事件來檢測調整大小。

(參見相關的事件:VIDEOEXPOSEACTIVEEVENThttp://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事件。 「

+0

更多的代碼一點..幾個小時後,谷歌上搜索,我發現它種imposibile :) *在線修正我SAI上一套新的模式應用程序崩潰,但它確實沒有崩潰,聲音和視頻停留在舊的環境中,新的屏幕是黑色的,我讀了一些opengl文檔,這就是我的結局,在這個時候opengl上下文和stuf對我來說是一個大問題,無論如何感謝您的幫助,爲Videoresize事件我沒有錯過它只是沒有把它。 – user1603219 2012-09-17 21:48:17