在PyGTK中使用F11键切换全屏的简单方法

5

我不是专业程序员,但经常使用PyGTK和Cairo进行数据可视化测试和原型设计。

我有一个标准的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)
1个回答

19

让我们先从如何捕获按键事件开始:我们需要连接到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)

但是我找不到相关的属性。


哇,你的回答非常透彻!非常感谢你花时间给我提供建议,但我需要一些时间来消化你的建议! - heltonbiker
@heltonbiker - 别担心 :) 如果你在实施中有问题,请告诉我。 - detly
1
窗口管理器可以在外部切换窗口的全屏状态,因此监听状态变化而不是自己的键绑定非常重要。 - Josh Lee
@jleedev - 同意,但如果你指的是第二种方法,它仍会在按下键时检查窗口的状态,并且不使用keypress事件来跟踪状态。 - detly

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接