Pygtk: удалить виджет из контейнера и повторно использовать его позже

#gtk #pygtk

#gtk #pygtk

Вопрос:

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

Проблема в том, что это работает плохо, я не вижу виджеты после их повторного добавления, я предполагаю, что происходит то, что когда я удаляю виджеты, они становятся нереализованными.

Есть ли какой-либо способ удалить виджет и повторно использовать его позже?

Ответ №1:

Документы pygtk дают некоторое представление.

Обратите внимание, что контейнеру будет принадлежать ссылка на widget, и что это может быть последняя сохраненная ссылка; поэтому удаление виджета из его контейнера может привести к уничтожению этого виджета. Если вы хотите использовать виджет снова, вам следует добавить ссылку на него.

ПРАВКИ

Я только что быстро изменил Hello World в pygtk, чтобы добавлять / удалять / изменять порядок виджетов в контейнере. Это работает, потому что button1 является переменной-членом класса, она никогда не выходит за пределы области видимости.

 #!/usr/bin/env python

# example helloworld2.py

import pygtk
pygtk.require('2.0')
import gtk

class HelloWorld2:

    # Our new improved callback.  The data passed to this method
    # is printed to stdout.
    def callback_remove(self, widget, data):
    self.box1.remove(self.button1);

    def callback_add(self, widget, data):
        self.box1.pack_start(self.button1, True, True, 0)

    # another callback
    def delete_event(self, widget, event, data=None):
        gtk.main_quit()
        return False

    def __init__(self):
        # Create a new window
        self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)

        # This is a new call, which just sets the title of our
        # new window to "Hello Buttons!"
        self.window.set_title("Hello Buttons!")

        # Here we just set a handler for delete_event that immediately
        # exits GTK.
        self.window.connect("delete_event", self.delete_event)

        # Sets the border width of the window.
        self.window.set_border_width(10)

        # We create a box to pack widgets into.  This is described in detail
        # in the "packing" section. The box is not really visible, it
        # is just used as a tool to arrange widgets.
        self.box1 = gtk.HBox(False, 0)

        # Put the box into the main window.
        self.window.add(self.box1)

        # Creates a new button with the label "Button 1".
        self.button1 = gtk.Button("Button 1")

        # Now when the button is clicked, we call the "callback" method
        # with a pointer to "button 1" as its argument
        self.button1.connect("clicked", self.callback_remove, "button 1")

        # Instead of add(), we pack this button into the invisible
        # box, which has been packed into the window.
        self.box1.pack_start(self.button1, True, True, 0)

        # Always remember this step, this tells GTK that our preparation for
        # this button is complete, and it can now be displayed.
        self.button1.show()

        # Do these same steps again to create a second button
        self.button2 = gtk.Button("Button 2")

        # Call the same callback method with a different argument,
        # passing a pointer to "button 2" instead.
        self.button2.connect("clicked", self.callback_add, "button 2")

        self.box1.pack_start(self.button2, True, True, 0)

        # The order in which we show the buttons is not really important, but I
        # recommend showing the window last, so it all pops up at once.
        self.button2.show()
        self.box1.show()
        self.window.show()

def main():
    gtk.main()

if __name__ == "__main__":
    hello = HelloWorld2()
    main()
  

Комментарии:

1. Да, я прочитал эту информацию, но я не знаю, смогу ли я вручную добавить ссылки на мой виджет. На виджет продолжает ссылаться python, но не GTK.

2. @pmoleri, я только что добавил быстрый и грязный пример. Он может довольно легко удалять и повторно добавлять виджеты в контейнер (HBox). Нажатие «Кнопки 1» удалит его, затем нажатие «Кнопки 2» добавит его обратно в конец контейнера. Я думаю, что «добавление ссылки» просто означает, что вы не можете позволить ему выйти за рамки.

Ответ №2:

Просто установите для свойства видимости виджета значение False, а позже — значение True с помощью set_visible метода.

Ответ №3:

нет, ему нужен только widgrt.его объекты не нужны.тогда видимый не должен использоваться.он будет скрывать только графически.но memmory все еще не выпущен

удалить функцию — это ответ

Комментарии:

1. Приятель, ты говоришь на каком-то волшебном языке, я ничего не могу понять