Pygtk: удалить виджет из контейнера и использовать его позже - PullRequest
7 голосов
/ 11 апреля 2011

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

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

Есть ли способ удалить виджет и использовать его позже?

Ответы [ 3 ]

6 голосов
/ 11 апреля 2011

Документы pygtk дают немного понимания.

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

редактирует

Я просто быстро изменил 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 голос
/ 14 февраля 2014

нет, ему нужны только объекты widgrt.its, которые не нужны. Затем видимые не должны использоваться. Это будет только скрывать graphicaly.но память, до сих пор не выпущенная

функция удаления является ответом

1 голос
/ 05 апреля 2013

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

...