【问题标题】:Simple way to toggle fullscreen with F11 in PyGTK在 PyGTK 中使用 F11 切换全屏的简单方法
【发布时间】:2011-07-11 04:53:41
【问题描述】:

我不是专业程序员,但经常使用 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 函数或方法或类似的东西,但我的 n00bness 使我不知道该怎么做。

任何帮助将不胜感激,谢谢。 (首选链接,这样我就可以自己做作业了;o)

【问题讨论】:

    标签: python gtk pygtk fullscreen


    【解决方案1】:

    让我们从如何获取按键开始:我们需要连接到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 - 不用担心 :) 如果您在实施时遇到问题,请告诉我
    • 窗口管理器可以在外部切换窗口的全屏状态,因此监听状态变化而不是你自己的键绑定是至关重要的。
    • @jleedev - 同意,但是如果您指的是第二种方法,它仍然会在按下键时检查窗口的状态,并且不使用 keypress 事件跟踪状态。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-20
    • 1970-01-01
    • 2012-10-23
    • 1970-01-01
    • 1970-01-01
    • 2021-09-02
    • 2016-03-14
    相关资源
    最近更新 更多