Python Gtk: Как использовать один и тот же виджет на разных страницах одного и того же блокнота?

В настоящее время я использую gtk на Python для создания некоторых графических интерфейсов. И я борюсь с небольшой проблемой: я хочу отобразить gtk.widget (например, HBox или Button) на нескольких страницах блокнота, но у меня ничего не получается. Виджет отображается только на первой странице, где он используется, но не на следующих. Я пробовал метод переопределения, но перевернул проблему, виджет отображается только на последнем.

import gtk
w = gtk.Window(gtk.WINDOW_TOPLEVEL)
w.connect("destroy", gtk.main_quit)
w.set_title("Some tests")
legnth = 850
width = 700
w.set_size_request(length, width)

VBoxWindow = gtk.HBox()

hbox1 = gtk.HBox()
notebook1 = gtk.Notebook()
page1 = gtk.Notebook()
page12 = gtk.VBox()
page13 = gtk.VBox()
page14 = gtk.VBox()

page1.append_page(page12, gtk.Label(' PAGE1 ')
page1.append_page(page13, gtk.Label(' PAGE2 ')
page1.append_page(page14, gtk.Label(' PAGE3 ')

box1 = gtk.VBox()
button1 = gtk.Button("BTN 1")
box1.pack_start(button1, True, True, 5)
page12.pack_start(box1, False, False, 5)

box2 = gtk.VBox()
box2.pack_start(button1, True, True, 5)
page13.pack_start(box2, False, False, 5)

# reparenting method test
#box3 = gtk.VBox()
#button1.reparent(box3)
#box3.pack_start(button1, True, True, 5)
#page13.pack_start(box3, False, False, 5)

page1.props.border_width = 12
page1.add(page12)
page1.add(page13)
notebook1.append_page(page1, gtk.Label('Some MAIN Page'))
VBoxWindow.add(notebook1)
w.add(VBoxWindow)
displayReady = True
w.show_all()
gtk.main()

3 ответа

Решение

Извините за ожидание, но я совершенно забыл поделиться своим решением с вами, ребята!

Вот что я нашел:

def reparent_on_switch(self, widget, page):
    for p in range(widget.get_n_pages()):
        container = widget.get_nth_pages(p)
        if not (p == page):
            pass
        else:
            self.foo.reparent(container)
            container.pack_start(self.foo)

Отлично работает!

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

Перемещение элементов управления осуществляется путем вызова remove() на старого родителя и add() (или специфичный для контроля вариант, такой как push_start()) на нового родителя. (Я забыл, если вам нужно управлять подсчетом ссылок в Python; если это так, вы также должны ref() виджет перемещается первым и unref() это позже; иначе, remove() уничтожит виджет.)

Вы можете следовать этому уроку в течение pyGObject а также python3 чтобы решить вашу проблему.

Попробуйте выполнить каждый шаг:

# This is a test application within PyGObject version 3.0+
import gi
# Test if gi version is 3.0+ 
gi.require_version('Gtk', '3.0')

from gi.repository import Gtk

class TestNoteBook(Gtk.Window):
    def __init__(self):
        # Initialize Gtk.Window
        Gtk.Window.__init__(self)
        # Add title to this app
        self.set_title("Test Note Book")
        # Connect the close button to self.quit_app() method
        self.connect("delete-event", self.quit_app)

        # Create a new Gtk.Widget with type Gtk.Notebook()
        notebook = Gtk.Notebook()
        # Add notebook to the current app class
        self.add(notebook)
        # Create a Gtk.HBox() in which we can add widgets
        page1 = Gtk.HBox()
        # Create button1
        button1 = Gtk.Button("I'm in the page 1")
        # Connect button1 to a signal
        button1.connect("clicked", self.button_clicked, "button1")
        # Add a Button to page1
        page1.add(button1)
        # Add page1 to the notebook with label page-1
        notebook.append_page(page1, Gtk.Label("page-1"))
        # Create new Gtk.HBox()
        page2 = Gtk.HBox()
        # Create button2
        button2 = Gtk.Button("I'm in the page 2")
        # Add a signal to button2
        button2.connect("clicked", self.button_clicked, "button2")
        # Add a button to page2
        page2.add(button2)
        # Add pag2e to the notebook with label page-2
        notebook.append_page(page2, Gtk.Label("page-2"))

    def run(self):
        # Show all the widgets
        self.show_all()
        # Run the Gtk.main loop
        Gtk.main()

    def quit_app(self, widget, args):
        # Print a message with the ID of the widget and its argument
        print("Exit this current window...", widget, args)
        # Exit from the window
        Gtk.main_quit()

    def button_clicked(self, widget, args):
        if args == "button1":
            print("Button 1 clicked!")
        else:
            print("Button2 clicked!")


# test
if __name__ == '__main__':
    app = TestNoteBook()
    app.run()
Другие вопросы по тегам