繁体   English   中英

Python Gtk:如何在同一笔记本的不同页面上使用同一小部件​​?

[英]Python Gtk: How to use the same widget on different pages of the same notebook?

我目前在Python上使用gtk创建一些图形界面。 我正在努力解决一个小问题:我想在笔记本的几页上显示gtk.widget(例如HBox或Button),但我无法成功。 该窗口小部件仅显示在使用该窗口的第一页上,而不会显示在随后的页面上。 我尝试了reparenting方法,但是出现了问题,该窗口小部件仅显示在最后一个窗口中。

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

不可以,一个小部件一次只能有一个父级。 如果希望相同的控件出现在选项卡的所有页面上,则必须创建重复的控件,在更改选项卡页面时动态移动它们,或将其完全置于选项卡控件之外。

通过在旧的父级上调用remove()并在新的父级上调用add() (或控件特定的变体,例如push_start() )来完成控件的移动。 (我忘记了是否需要在Python中管理引用计数;如果是这样,还必须先unref()要移动的小部件ref() ,然后再unref() ;否则, remove()将破坏该小部件。)

抱歉等待,但是我完全忘了与大家分享我的解决方案!

这是我发现的:

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)

它像一个魅力!

您可以在pyGObjectpython3中按照本教程进行pyGObject ,以解决您的问题。

尝试执行以下步骤:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM