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