在PyGTK中用F11切换全屏的简单方法
我不是专业程序员,但我经常使用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
信号的类是有意义的,这样它就能记录窗口是全屏还是非全屏。
所以我们需要一个对象,它:
- 跟踪特定窗口的全屏和非全屏状态,
- 检测键盘按键事件,并判断该如何处理。
那么我们到底怎么切换全屏状态呢?其实很简单,使用 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)
但我找不到相关的属性。