pygtk如何替换切换页面上选项卡的内容
pygtk how to replace the contents of a tab on switch-page
假设我有这样的基本笔记本:
import gi
gi.require_version("Gtk", "3.0")
from gi.repository import GLib, Gtk
class MainWindow(Gtk.Window):
def __init__(self):
Gtk.Window.__init__(self, title="My App")
self._init = False # Try to stop recursion errors during setup
self.notebook = Gtk.Notebook()
self.page0 = Gtk.Label(label='Some text')
self.page1 = Gtk.Label(label='More text')
self.notebook.append_page(self.page0, Gtk.Label(label='p1'))
self.notebook.append_page(self.page1, Gtk.Label(label='p2'))
self.notebook.connect('switch-page', self.refresh)
self.add(self.notebook)
self._init = True
def refresh(self, notebook, page, page_num):
if page_num == 0 and self._init:
self.remove(self.page0)
self.page0 = Gtk.Label(label='Some more and different text')
self.notebook.prepend_page(self.page0, Gtk.Label(label='p1'))
self.notebook.set_current_page(0)
win = MainWindow()
win.connect("destroy", Gtk.main_quit)
win.show_all()
Gtk.main()
我想做的是,当用户点击第一个选项卡(因此出现切换页面信号)时,该选项卡会“刷新”(在这种情况下只是替换文本,但它可能更丰富更改,例如更改显示的小部件)。我应该尝试删除“旧”选项卡并在位置 0 插入一个新选项卡,还是调用选项卡上的某个函数来更新它显示的内容?
显示的代码因递归问题而崩溃(我想 switch-page 在设置过程中被调用了?),这就是为什么我认为调用某种 updateWidegt() 函数可能比尝试删除页面更好。但我不确定如何让笔记本“看到”这些变化。
无限递归的原因是 switch-page
处理程序 refresh()
在您更新页面时发出信号。正如您所提到的,您可以通过不更改页面而只更新页面内的小部件来避免这种情况。我在下面更新了您的示例:
from gi.repository import Gtk
class MainWindow(Gtk.Window):
def __init__(self):
Gtk.Window.__init__(self, title="My App")
self.notebook = Gtk.Notebook()
self.count = 0
self.page0 = Gtk.Label(label='Some text')
self.page1 = Gtk.Label(label='More text')
self.notebook.append_page(self.page0, Gtk.Label(label='p1'))
self.notebook.append_page(self.page1, Gtk.Label(label='p2'))
self.notebook.connect('switch-page', self.refresh)
self.add(self.notebook)
def refresh(self, notebook, page, page_num):
self.count += 1
if page_num == 0:
self.page0.set_label('Some more and different text {count}'.format(count=self.count))
win = MainWindow()
win.connect("destroy", Gtk.main_quit)
win.show_all()
Gtk.main()
如果您想添加小部件,让您的笔记本页面成为 Gtk.Box
或其他容器小部件,然后向其中添加小部件。另一种比 adding/removing 动态小部件更简单的方法是在启动时添加所有小部件,并在适当的时候简单地 hide/show 它们。
假设我有这样的基本笔记本:
import gi
gi.require_version("Gtk", "3.0")
from gi.repository import GLib, Gtk
class MainWindow(Gtk.Window):
def __init__(self):
Gtk.Window.__init__(self, title="My App")
self._init = False # Try to stop recursion errors during setup
self.notebook = Gtk.Notebook()
self.page0 = Gtk.Label(label='Some text')
self.page1 = Gtk.Label(label='More text')
self.notebook.append_page(self.page0, Gtk.Label(label='p1'))
self.notebook.append_page(self.page1, Gtk.Label(label='p2'))
self.notebook.connect('switch-page', self.refresh)
self.add(self.notebook)
self._init = True
def refresh(self, notebook, page, page_num):
if page_num == 0 and self._init:
self.remove(self.page0)
self.page0 = Gtk.Label(label='Some more and different text')
self.notebook.prepend_page(self.page0, Gtk.Label(label='p1'))
self.notebook.set_current_page(0)
win = MainWindow()
win.connect("destroy", Gtk.main_quit)
win.show_all()
Gtk.main()
我想做的是,当用户点击第一个选项卡(因此出现切换页面信号)时,该选项卡会“刷新”(在这种情况下只是替换文本,但它可能更丰富更改,例如更改显示的小部件)。我应该尝试删除“旧”选项卡并在位置 0 插入一个新选项卡,还是调用选项卡上的某个函数来更新它显示的内容?
显示的代码因递归问题而崩溃(我想 switch-page 在设置过程中被调用了?),这就是为什么我认为调用某种 updateWidegt() 函数可能比尝试删除页面更好。但我不确定如何让笔记本“看到”这些变化。
无限递归的原因是 switch-page
处理程序 refresh()
在您更新页面时发出信号。正如您所提到的,您可以通过不更改页面而只更新页面内的小部件来避免这种情况。我在下面更新了您的示例:
from gi.repository import Gtk
class MainWindow(Gtk.Window):
def __init__(self):
Gtk.Window.__init__(self, title="My App")
self.notebook = Gtk.Notebook()
self.count = 0
self.page0 = Gtk.Label(label='Some text')
self.page1 = Gtk.Label(label='More text')
self.notebook.append_page(self.page0, Gtk.Label(label='p1'))
self.notebook.append_page(self.page1, Gtk.Label(label='p2'))
self.notebook.connect('switch-page', self.refresh)
self.add(self.notebook)
def refresh(self, notebook, page, page_num):
self.count += 1
if page_num == 0:
self.page0.set_label('Some more and different text {count}'.format(count=self.count))
win = MainWindow()
win.connect("destroy", Gtk.main_quit)
win.show_all()
Gtk.main()
如果您想添加小部件,让您的笔记本页面成为 Gtk.Box
或其他容器小部件,然后向其中添加小部件。另一种比 adding/removing 动态小部件更简单的方法是在启动时添加所有小部件,并在适当的时候简单地 hide/show 它们。