Python Gtk:如何在同一个笔记本的不同页面上使用同一个小部件?
Python Gtk: How to use the same widget on different pages of the same notebook?
我目前正在 Python 上使用 gtk 创建一些图形界面。我正在努力解决一个小问题:我想在笔记本的几页上显示 gtk.widget(例如 HBox 或 Button),但我无法成功。该小部件仅显示在使用它的第一页上,而不会显示在随后的页面上。我试过reparenting的方法但是倒置的问题,widget只显示在最后一个。
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()
您可以在 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()
不可以,一个小部件一次只能有一个父级。如果您希望相同的控件出现在选项卡的所有页面上,则必须创建重复的控件,在更改选项卡页面时动态移动它们,或者将它们完全放在选项卡控件之外。
通过在旧父级上调用 remove()
和在新父级上调用 add()
(或特定于控件的变体,例如 push_start()
)来移动控件。 (我忘记了您是否需要在 Python 中管理引用计数;如果是这样,您还必须 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)
它就像一个魅力!
我目前正在 Python 上使用 gtk 创建一些图形界面。我正在努力解决一个小问题:我想在笔记本的几页上显示 gtk.widget(例如 HBox 或 Button),但我无法成功。该小部件仅显示在使用它的第一页上,而不会显示在随后的页面上。我试过reparenting的方法但是倒置的问题,widget只显示在最后一个。
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()
您可以在 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()
不可以,一个小部件一次只能有一个父级。如果您希望相同的控件出现在选项卡的所有页面上,则必须创建重复的控件,在更改选项卡页面时动态移动它们,或者将它们完全放在选项卡控件之外。
通过在旧父级上调用 remove()
和在新父级上调用 add()
(或特定于控件的变体,例如 push_start()
)来移动控件。 (我忘记了您是否需要在 Python 中管理引用计数;如果是这样,您还必须 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)
它就像一个魅力!