我已经使用 GTK3、Python 和 Glade 将两个 matplotlib 图插入到一个容器中。他们使用来自第三方 API 的数据绘制区域的天气。我希望在我输入新的语言环境并按下刷新按钮时更新图表。
下面的每个解决方案都以不同的问题结束。太多了无法一一描述。通常,他们设法用新图表显示主窗口的另一个实例,但带有旧图表的旧实例保持打开状态。我试过了:
销毁父容器,然后重新加载更新的容器。以下代码产生分段错误。代码尝试将对象从构建器的新实例传递给旧实例。我相信这是我的主要问题。我不知道如何将我正在使用的构建器的实例传递到其中,on_refresh_button_click()而不必将所有内容都重写到一个类中。
def on_refresh_button_click(self, widget):
parent = self.get_parent()
grandparent = parent.get_parent()
parent.destroy()
city_name = "yerevan"
db = "test.db"
get_updated_data(city_name)
builder = builder_with_signals()
read_weather_from_db(db, builder, city_name)
grandparent.add(parent)
parent.show_all()
使用self.get_parent()获取按钮的父容器为对象上下工夫。这几乎奏效了,我想。我可以remove()和destroy()包含图形的容器。我想我也成功添加了更新的。但我无法让它显示出来。编码:
def on_refresh_button_click(self, widget):
parent = self.get_parent()
city_name = "yerevan"
db = "test.db"
get_updated_data(city_name)
fig_list = read_weather_from_db(db, city_name)
for child in parent:
try:
for grandchild in child:
if Gtk.Buildable.get_name(grandchild) == "chart_past":
parent = child # Confusing, yes.
old = grandchild
new = FigureCanvas(fig_list[0])
props = {}
for key in parent.list_child_properties():
props[key.name] = parent.child_get_property(old, key.name)
parent.remove(old)
parent.add(new)
for name, value in props.items():
parent.child_set_property(new, name, value)
parent.show_all()
child.show_all()
grandchild.show_all()
# Try to find the newly added object
for item in parent:
print("trying to find another:", Gtk.Buildable.get_name(item))
except:
print(Gtk.Buildable.get_name(child))
繁花如伊
相关分类