2011-03-08 88 views
5

我不是專業程序員,但我經常使用PyGTK和Cairo進行數據可視化測試和原型設計。在PyGTK中使用F11切換全屏的簡單方法

我的PyGTK的標準模板,我從網絡,它不「標準的東西」 GTK需要工作了:

import pygtk 
pygtk.require('2.0') 
import gtk 

""" 
lots of stuff 
""" 

if __name__ == "__main__": 
    mainWindow = gtk.Window() 
    mainWindow.set_title(some_title) 
    mainWindow.connect("delete-event", gtk.main_quit) 
    #mainWindow.set_position(gtk.WIN_POS_CENTER) 
    #mainWindow.fullscreen() 
    mainWindow.show_all() 
    gtk.main() 

我通常看到使用F11切換全屏大多數應用程序,所以我想知道是否有一種簡單的方法將此功能添加到我的腳本中。我想這可能意味着將事件信號連接到gtk函數或方法或類似的東西,但我的努力使我無法知道如何做到這一點。

任何幫助,將不勝感激,謝謝。 (首選鏈接,以便我可以自己做作業; o)

回答

17

讓我們從如何選擇按鍵開始:我們需要連接到key-press-event信號。當然,我們需要一些東西來連接它

這個東西應該跟蹤窗口狀態,因此使用一個連接到window-state-event信號的類並且跟蹤窗口是否全屏顯示是有意義的。

因此,我們需要一個對象:

  1. 保持跟蹤特定窗口的全屏/非全屏狀態,並
  2. 檢測按鍵事件,並計算出如何處理它

儘管我們如何實際切換全屏狀態?很簡單,使用window.fullscreen()/window.unfullscreen()函數。

所以我們有類似:

class FullscreenToggler(object): 

    def __init__(self, window, keysym=gtk.keysyms.F11): 
     self.window = window 
     self.keysym = keysym 
     self.window_is_fullscreen = False 
     self.window.connect_object('window-state-event', 
            FullscreenToggler.on_window_state_change, 
            self) 

    def on_window_state_change(self, event): 
     self.window_is_fullscreen = bool(
      gtk.gdk.WINDOW_STATE_FULLSCREEN & event.new_window_state) 

    def toggle(self, event): 
     if event.keyval == self.keysym: 
      if self.window_is_fullscreen: 
       self.window.unfullscreen() 
      else: 
       self.window.fullscreen() 

這需要一個窗口和可選的鍵符常數(默認爲F11)。使用它像這樣:

toggler = FullscreenToggler(window) 
window.connect_object('key-press-event', FullscreenToggler.toggle, toggler) 

注意使用connect_object代替connect,它讓我們可以添加一個未使用的參數。

側面說明:如果有一個簡單的方法來檢查,如果窗口是全屏,我們能夠避免這種基於類的方法和使用功能,即不喜歡的東西:

def fullscreen_toggler(window, event, keysym=gtk.keysyms.F11): 
    if event.keyval == keysym: 
     fullscreen = bool(
       gtk.gdk.WINDOW_STATE_FULLSCREEN & 
       window.get_property('window-state')) 
     if fullscreen: 
      window.unfullscreen() 
     else: 
      window.fullscreen() 

。 ..和然後...

window.connect('key-press-event', fullscreen_toggler) 

但我無法找到這個屬性。

+1

優秀的解決方案! +1 – ptomato 2011-03-09 10:42:57

+0

哇,你的回答非常徹底!非常感謝您給予您的時間,但我需要一些時間來消化您的提示! – heltonbiker 2011-03-09 13:12:07

+0

@heltonbiker - 不用擔心:)讓我知道如果您在實現時遇到問題 – detly 2011-03-10 01:35:59