Почему сигнал уничтожения не достигает дочерних элементов окна Gtk.ScrolledWindow? - PullRequest
0 голосов
/ 18 сентября 2018

Пожалуйста, примите во внимание этот код Python для простого окна GTK:

import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk

def on_destroy(widget):
    print("Destroying {}".format(widget))

def on_click(button, scroll):
    scroll.destroy()

scroll = Gtk.ScrolledWindow()
scroll.connect("destroy", on_destroy)

button = Gtk.Button.new_with_label("Self-destruct")
scroll.add(button)
button.connect("destroy", on_destroy)
button.connect("clicked", on_click, scroll)

window = Gtk.Window()
window.add(scroll)
window.connect("destroy", Gtk.main_quit)
window.set_size_request(200, 75)
window.show_all()
Gtk.main()

При нажатии кнопки я ожидаю получить две строки вывода, сообщающие, что ScrolledWindow и кнопка были уничтожены.На самом деле я получаю только одну строку, сообщающую о ScrolledWindow, сигнал уничтожения никогда не достигает кнопки.Если я заменю ScrolledWindow на обычный Box, сигнал уничтожения дойдет до кнопки.Почему это?

1 Ответ

0 голосов
/ 18 сентября 2018

Я действительно не могу сказать вам намного больше, чем этот код, который действительно удаляет кнопку. Надеюсь, вы можете адаптировать его к вашим потребностям. Кажется, что кнопка отсоединяется от окна просмотра и ни к чему не присоединяется, потому что обработчик уничтожения кнопки запускается при завершении работы приложения и вызывает странные ошибки. Было бы интересно опубликовать это в списке рассылки Gtk для любых других мыслей.

import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk

def on_destroy(widget, viewport):
    print("Destroying {}".format(widget))
    viewport.get_child().destroy()

def on_button_destroy(widget):
    print("Destroying button {}".format(widget))

def on_click(button):
    scroll = button.get_parent().get_parent()
    scroll.destroy()

scroll = Gtk.ScrolledWindow()
button = Gtk.Button.new_with_label("Self-destruct")
scroll.add(button)
viewport = button.get_parent()
button.connect("destroy", on_button_destroy)
scroll.connect("destroy", on_destroy, viewport)
button.connect("clicked", on_click)

window = Gtk.Window()
window.add(scroll)
window.connect("destroy", Gtk.main_quit)
window.set_size_request(200, 75)
window.show_all()
Gtk.main()
...