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()