Простой способ переключить полноэкранный режим с помощью F11 в PyGTK - PullRequest
5 голосов
/ 08 марта 2011

Я не профессиональный программист, но регулярно использую 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)

1 Ответ

19 голосов
/ 09 марта 2011

Давайте начнем с того, как нажимать на клавишу: нам нужно подключиться к сигналу 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()

Это займет окнои необязательная константа keysym (по умолчанию 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)

Но я не смог найти недвижимость для этого.

...