Доступ к области Gdk после импорта Gtk и закрытия окна

Я оказался в ситуации, когда мне нужно было закрыть окно, которое я создал в подклассе Gtk.Window. Я подключал событие window.destroy для закрытия окна изначально к Gtk.main_quit для тестирования, но когда я загрузил модуль в свою основную программу, я не мог сделать это так, конечно, не закрыв основную программу. Когда я писал функцию, я по глупости вызвал метод window.destroy(), который, по глупости с моей стороны, привел к ошибке максимальной рекурсии. Итак, я решил подключить «событие удаления», а затем вызвать window.destroy(), который все еще рекурсировал, потому что (как я узнал) событие уничтожения вызывает событие удаления. Итак, я связал событие уничтожения с функцией и попытался вызвать:

window.emit('delete-event')

который работал, но привел к ошибке, требующей другого параметра. Изучая, я узнал, что это должно быть что-то вроде этого из gtk2:

window.emit("delete-event", gtk.gdk.Event(gtk.gdk.DELETE))

Я не могу найти Gdk под Gtk, как я могу найти gdk под gtk. Мне это не нравится. Я импортировал Gdk, и Gdk.Event найден, но нет эквивалента gtk.gdk.DELETE variable. Я сделал:

l = dir(Gdk)
for i in l:
    if 'DELETE' in i:
        print(i)

и не обнаружил переменной DELETE, определенной в Gdk.

Как мы можем получить доступ к Gdk из Gtk? Если нет, то как нам перевести эти gtk.gdk... вещи, если они не существуют в Gdk?

В конце концов, я просто сделал:

del window

чтобы сделать то, что мне нужно было сделать, но я все еще хотел бы знать, как сделать сигнал излучения выше в Gtk3 для учебных целей.

Спасибо,

Нарни


person narnie    schedule 02.01.2013    source источник


Ответы (1)


В GTK 3 нет gtk.gdk, вся эта функциональность или ее эквивалент должны быть доступны с использованием from gi.repository import Gdk. Предыдущая иерархия gtk.gdk была на самом деле для удобства, но не имела никакого смысла, потому что GDK — полностью независимый пакет и не является частью GTK. Новая организация имеет больше смысла, потому что иерархия и имена переменных точно такие же, как в C, Javascript и т. д. API.

В этом случае gtk.gdk.DELETE доступен как Gdk.EventType.DELETE, поэтому вы сможете сделать

window.emit('delete-event', Gdk.Event(Gdk.EventType.DELETE))

Однако вы не должны сами подавать сигналы о событиях , поэтому было бы лучше сделать:

window.event(Gdk.Event(Gdk.EventType.DELETE))

Или, что еще лучше, вообще не подключайтесь к событию в своем модуле. Затем вы можете использовать window.destroy() без ошибки рекурсии. Подключитесь к сигналу уничтожения в вашей основной программе, затем вы можете просто вызвать Gtk.main_quit.

person ptomato    schedule 03.01.2013
comment
Первая часть действительно помогает. Я просто не мог найти его. Последняя часть не будет работать, потому что я не хочу, чтобы Gtk.main_quit закрывало окно. Как я могу закрыть окно по запросу пользователя (при условии, что запрос исходит из окна X и не нажимает кнопку закрытия) без подключения к сигналам destroy или delete-event? - person narnie; 14.01.2013
comment
Кроме того, спасибо, что дали мне знать о том, как излучать, не излучая себя, но через Window.event. Я все еще довольно рано использую графический интерфейс, так что это маленькие самородки, которые действительно помогают. Я благодарен людям, которые очень легко помогают таким, как я :) - person narnie; 14.01.2013
comment
Что ж, если пользователь нажимает кнопку X, то окно получает сигнал delete-event, который должен закрыть и уничтожить окно по умолчанию, и вам не нужно ничего делать. Кажется, я не понимаю вашего дополнительного вопроса? - person ptomato; 14.01.2013