从动态 GUI 中的 Gtk 视口/滚动窗口中删除小部件

2024-02-17

我正在构建一个 GUI(GTK3 的 Python 绑定),其中一个 Gtk 滚动窗口(来自 Glade)可以包含不同的树视图。该程序启动时有一个空窗口,第一次一切正常:

 self.scrolled_window.add_with_viewport(treeview)
 self.main_window.show_all()

Edit:测试程序图片(见下面的来源):

第二次我收到以下错误:

(main.py:15905):Gtk-CRITICAL **:gtk_scrolled_window_add_with_viewport:断言'gtk_bin_get_child(GTK_BIN(child_widget))== NULL'失败

我认为我可能需要先清空视口或滚动窗口,但不知道这是如何完成的,也找不到任何相关文档。

Edit:使用时self.scrolled_window.remove(self.scrolled_window.get_child())我在启动时看不到数据集,并且在切换图层时出现错误消息。

编辑:我再次更新了代码,因此示例数据从一开始就在那里。

林间空地文件(test_project.glade):

<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.16.1 -->
<interface>
  <requires lib="gtk+" version="3.10"/>
  <object class="GtkWindow" id="window1">
    <property name="can_focus">False</property>
    <property name="default_width">440</property>
    <property name="default_height">250</property>
    <signal name="destroy" handler="on_window1_destroy" swapped="no"/>
    <child>
      <object class="GtkBox" id="box1">
        <property name="visible">True</property>
        <property name="can_focus">False</property>
        <property name="orientation">vertical</property>
        <child>
          <object class="GtkScrolledWindow" id="scrolledwindow1">
            <property name="visible">True</property>
            <property name="can_focus">True</property>
            <property name="shadow_type">in</property>
            <child>
              <placeholder/>
            </child>
          </object>
          <packing>
            <property name="expand">True</property>
            <property name="fill">True</property>
            <property name="position">0</property>
          </packing>
        </child>
        <child>
          <object class="GtkScrolledWindow" id="scrolledwindow2">
            <property name="visible">True</property>
            <property name="can_focus">True</property>
            <property name="shadow_type">in</property>
            <child>
              <placeholder/>
            </child>
          </object>
          <packing>
            <property name="expand">True</property>
            <property name="fill">True</property>
            <property name="position">1</property>
          </packing>
        </child>
        <child>
          <object class="GtkBox" id="box2">
            <property name="visible">True</property>
            <property name="can_focus">False</property>
            <child>
              <object class="GtkButton" id="add_layer">
                <property name="label" translatable="yes">add layer</property>
                <property name="visible">True</property>
                <property name="can_focus">True</property>
                <property name="receives_default">True</property>
                <signal name="clicked" handler="on_add_layer_clicked" swapped="no"/>
              </object>
              <packing>
                <property name="expand">False</property>
                <property name="fill">True</property>
                <property name="position">0</property>
              </packing>
            </child>
            <child>
              <object class="GtkButton" id="add_data">
                <property name="label" translatable="yes">add data</property>
                <property name="name">add_data</property>
                <property name="visible">True</property>
                <property name="can_focus">True</property>
                <property name="receives_default">True</property>
                <signal name="clicked" handler="on_add_data_clicked" swapped="no"/>
              </object>
              <packing>
                <property name="expand">False</property>
                <property name="fill">True</property>
                <property name="position">1</property>
              </packing>
            </child>
          </object>
          <packing>
            <property name="expand">False</property>
            <property name="fill">True</property>
            <property name="position">2</property>
          </packing>
        </child>
      </object>
    </child>
  </object>
</interface>

蟒蛇代码:

#!/usr/bin/python3

from gi.repository import Gtk
import random

class BottomTreeView(Gtk.TreeView):
    def __init__(self, store):
        Gtk.TreeView.__init__(store)
        self.store = store

        renderer = Gtk.CellRendererText()
        column = Gtk.TreeViewColumn("Dataset", renderer, text=0)
        self.append_column(column)

        for x in range(10):
            self.store.append(None, [str(random.random())])

class MainWindow(object):
    def __init__(self, builder):
        self.main_window = builder.get_object("window1")
        self.sw1 = builder.get_object("scrolledwindow1")
        self.sw2 = builder.get_object("scrolledwindow2")
        self.layernumber = 0

        self.topstore = Gtk.TreeStore(str, object)
        self.topview = Gtk.TreeView(self.topstore)
        renderer1 = Gtk.CellRendererText()
        column1 = Gtk.TreeViewColumn("Name", renderer1, text=0)
        self.topview.append_column(column1)
        self.sw1.add_with_viewport(self.topview)

        #Adding test data in a dumb way
        self.store1 = Gtk.TreeStore(str)
        for x in range(10):
            self.store1.append(None, [str(random.random())])
        self.view1 = Gtk.TreeView(self.store1)
        self.rend1 = Gtk.CellRendererText()
        self.col1 = Gtk.TreeViewColumn("Dataset", self.rend1, text=0)
        self.view1.append_column(self.col1)
        self.sw2.add_with_viewport(self.view1)
        self.topstore.append(None, ["Layer 1", self.view1])

        self.store2 = Gtk.TreeStore(str)
        for x in range(10):
            self.store2.append(None, [str(random.random())])
        self.view2 = Gtk.TreeView(self.store2)
        self.rend2 = Gtk.CellRendererText()
        self.col2 = Gtk.TreeViewColumn("Dataset", self.rend2, text=0)
        self.view2.append_column(self.col2)
        self.topstore.append(None, ["Layer 2", self.view2])

        self.select = self.topview.get_selection()
        self.select.connect("changed", self.on_tree_selection_changed)
        self.main_window.show_all()

    def on_add_layer_clicked(self, widget):
        self.layernumber += 1
        store = Gtk.TreeStore(str)
        bottom = BottomTreeView(store)
        self.topstore.append(None, [str(self.layernumber), bottom])

    def on_add_data_clicked(self, widget):
        self.selection = self.topview.get_selection()
        model, treeiter = self.selection.get_selected()
        print("Adding data to {0}".format(model[treeiter][0]))
        datasheet = model[treeiter][1]
        datasheet.store.append(None, [str(random.random())])

    def on_window1_destroy(self, widget):
        Gtk.main_quit()

    def on_tree_selection_changed(self, selection):
        print("\n>>> Selection changed")
        model, treeiter = selection.get_selected()
        print(">>> Model: {0}, Treeiter: {1}".format(model, treeiter))
        if treeiter != None:
             print(">>> You selected Layer {0}.".format(model[treeiter][1]))
             tree_obj = model[treeiter][1]
             #The following lines mess up the program from the startup
             #self.sw2.remove(self.sw2.get_child())
             #self.sw2.add_with_viewport(tree_obj)
             #self.main_window.show_all()

def main():
    builder = Gtk.Builder()
    objects = builder.add_objects_from_file("test_project.glade",
         ("window1", ""))

    window_instance = MainWindow(builder)
    builder.connect_signals(window_instance)
    Gtk.main()

if __name__ == "__main__":
     main()

要清除滚动窗口,请执行以下操作:

self.scrolled_window.remove(self.scrolled_window.get_child())
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从动态 GUI 中的 Gtk 视口/滚动窗口中删除小部件 的相关文章

  • DrawingArea无法获取XID

    我有以下 Python 2 7 PyGObject 3 0 PyGST 0 10 模块 from gi repository import Gtk Gdk GdkPixbuf import pango import pygst pygst
  • 使用 Python gtk3 在 X 上进行全局键绑定

    我正在寻找一些可以与 gtk3 一起使用的 python xlib 全局键绑定示例 就像为 gtk2 所做的那样http www siafoo net snippet 239 这里的代码非常相似 from Xlib display impo
  • 关于python中switch的一些问题

    这是我在 StackOverflow 上的第一个问题 所以如果某些信息不存在或者我错过了一些重要的信息 请耐心等待我 但无论如何我会尽力 最近我开始用Python2 7编写代码 所以我不太擅长 在使用 PyGtk PyGObject Gla
  • 如何在 Haskell 的 GI-Gtk 中将 Widget 转换为 Label?

    我有这个示例代码 其中有一个包含 ListBoxRows 的 ListBox 而 ListBoxRows 又包含一个 Label 当我单击 ListBox 时 我得到一个 ListBoxRow 到目前为止 一切都很好 当我想与 ListBo
  • gtk3 - 使用 GSimpleAction 时保留快捷键

    在 gtk3 中 可以使用以下命令将加速键和路径保存到文件中 gtk accel map https developer gnome org gtk3 stable gtk3 Accelerator Maps html gtk accel
  • 将 CellRendererToggle 的单行设置为不一致

    在 Gtk 3 上 我使用的是TreeModel存储嵌套信息并用 a 显示它CellRendererText and a CellRendererToggle 用户可以单击每个切换按钮 当存在嵌套按钮并且它们不处于相同状态时 我希望上层按钮
  • 如何使用Gtk.events_pending?

    我有这个基本的 测试 应用程序 我想在其中显示一个旋转器 而它正在长时间运行发射进程 带有数据库请求的函数 让用户知道它不是在调试而是正在启动 我在其他帖子中读到可以这样做Gtk events pending 功能 但我不知道如何 在哪里使
  • Python Gtk 3.0:如何在 Notebook 中获取焦点

    我正在尝试将焦点设置为Entry输入字段 如果我把它放在一个Box 我可以通过设置焦点grab focus方法 但如果Entry是在一个里面Notebook 它没有聚焦 示例代码 import gi gi require version G
  • 从动态 GUI 中的 Gtk 视口/滚动窗口中删除小部件

    我正在构建一个 GUI GTK3 的 Python 绑定 其中一个 Gtk 滚动窗口 来自 Glade 可以包含不同的树视图 该程序启动时有一个空窗口 第一次一切正常 self scrolled window add with viewpo
  • ValueError:命名空间 Gtk 不可用

    按照说明进行操作时2 入门 Python GTK 3 教程 3 4 文档 https python gtk 3 tutorial readthedocs io en latest introduction html Tries In 6 i
  • 在 Python 中实现 GObject 接口

    当使用 GTK3 的 Python 3 绑定时 是否可以实现gobject GInterface通过子类化接口 在我的具体情况下 我想写一个自定义Gtk TreeModel https lazka github io pgi docs Gt
  • 通过 pip 安装 PyGObject 时缺少文件 msvc_recommended_pragmas.h

    我尝试通过 pip 安装 PyGObject 但失败并出现给定错误 Building wheels for collected packages pygobject Building wheel for pygobject PEP 517
  • GTK 3.x 是一个真正的跨平台解决方案吗?

    我已经尝试过 Qt 4 x 5 x 和 GTKmm 3 x 相比 Qt 我更喜欢 GTKmm 现在我刚刚发现 GTKmm 3 x 不提供 Windows 移植 他们也不提供 Mac 移植 基本上我除了 Linux 的库 源代码 二进制文件之
  • 将glade文件与程序g++链接

    Glade 文件和程序文件可能会变得有点混乱 当您希望程序可移植时 这会成为一个问题 有什么方法可以将您的程序与林间空地文件绑定吗 源代码 未完成但正在运行的项目 https github com caelwithcats valuator
  • 如何从 Python 将一项添加到 GTK 的“最近使用”文件列表中?

    我正在尝试从 Ubuntu 上的 Python 3 添加到 最近使用的 文件列表 我能够成功read最近使用的文件列表如下 from gi repository import Gtk recent mgr Gtk RecentManager
  • 设置 Gtk3 MenuItem 的悬停背景颜色

    我有一个带有弹出菜单的托盘图标 我正在尝试设置此弹出窗口中菜单项的背景颜色 我可以设置文本颜色 但不能设置菜单项的背景颜色 显示的背景是默认的 Ubuntu 橙色 我无法覆盖它 我创建了一个示例应用程序来演示这个问题 只需将其复制粘贴到 p
  • GTK+ CSS 一键式

    如何在 GTK 中为一个按钮设置颜色 GtkButton button8 border radius 20 border width 1 1 1 1 font Sans 16 color black background image gtk
  • 如何使用 css 代码单独设置 gtk 小部件的样式

    在这之后GTK 将字体更改为旋转按钮 https stackoverflow com questions 47083294 gtk change font to spin button和这个为什么 CSS 样式没有应用于 GTK 代码 ht
  • 在 virtualenv 中通过 pip 安装 PyGObject [重复]

    这个问题在这里已经有答案了 我实际上正在将旧的 django 应用程序从 python2 7 升级到 python3 4 通过 pip 安装 pygobject 时 出现此错误 Collecting pygobject Using cach
  • python 和 gtk3 剪贴板 onChange

    使用 PyGTK 2 我可以附加一个在剪贴板内容更改时要执行的函数 浏览 GTK3 的 python 绑定的文档 我找不到此类功能的任何描述 谁能告诉我这方面的 最佳实践 EDIT 使用 gtk2 可以实现以下功能 import gtk d

随机推荐