将 CellRendererToggle 的单行设置为不一致

2023-12-30

在 Gtk+3 上,我使用的是TreeModel存储嵌套信息并用 a 显示它CellRendererText and a CellRendererToggle。用户可以单击每个切换按钮,当存在嵌套按钮并且它们不处于相同状态时,我希望上层按钮反映“不一致”状态。我怎样才能设置这个属性一个元素 ?

For more clarity, an example of what I want to achieve from the Transmission bittorrent client : enter image description here

我知道如何将单元格渲染器的所有按钮设置为不一致的状态myCellRendererToggle.set_properties(inconsistent=True)但似乎我无法从这里访问单个元素;

我知道如何访问 TreeStore 模型的特定行,但我只能设置“True”和“False”值。

我的代码与官方文档相当接近,因此您可以帮助我:https://python-gtk-3-tutorial.readthedocs.org/en/latest/cellrenderers.html#cellrenderertoggle https://python-gtk-3-tutorial.readthedocs.org/en/latest/cellrenderers.html#cellrenderertoggle(我使用 treeStore 而不是 listStore)

这是我的代码:

class HelloMyApp:

def __init__(self):

    # Set the Glade file
    self.builder = Gtk.Builder()
    self.builder.add_from_file(GLADEFILE)


    dic = {
        "on_button1_clicked" : self.btnValidate_clicked,
        "on_MainWindow_destroy" : self.quit,
        "on_window1_delete_event" : self.quit,

        }

    self.builder.connect_signals(dic)

    window = self.builder.get_object("window1")

    treeview1 = self.builder.get_object("treeview1")

    ######## This is my model : it stores a string and a boolean. #########
    self.treeModel = Gtk.TreeStore(str, bool)

    # Example on how to insert data in the model
    treeIter = self.treeModel.append(None, ['example one', True])
    self.treeModel.append(treeIter, [' simple elt', True])
    treeIter = self.treeModel.append(treeIter, ['example two', False])
    self.treeModel.append(treeIter, ['under example two', True])


    select = treeview1.get_selection()
    select.set_mode(Gtk.SelectionMode.BROWSE)

    select.connect("changed", self.on_tree_selection_changed, buf) 

    # Using one column of text and another column with the toggle buttons
    renderer = Gtk.CellRendererText()
    column = Gtk.TreeViewColumn("Title", renderer, text=0)
    treeview1.append_column(column)

    ######  Here is the CellRendereToggle  ################
    renderer_toggle = Gtk.CellRendererToggle()
    renderer_toggle.connect("toggled", self.on_cell_toggled)
    column_toggle = Gtk.TreeViewColumn("Installer", renderer_toggle, active=1)
    treeview1.append_column(column_toggle)

    treeview1.set_model(self.treeModel)


    window.show_all()


if __name__ == "__main__":

    HelloMyApp = HelloMyApp()
    Gtk.main()

Thanks !

编辑:回答马库斯:我无法弄清楚,当我更改函数内的 CellRendererToggle 属性时,它会更改每一行。

编辑解决方案:正如 Marcu 指出的,我们必须在每种情况下设置属性,这就是我添加的原因else part.

def cellRenderer_func(column, cellRenderer, treeModel, treeIter, userData):
    if 'cat' in treeModel.get_value(treeIter, 0): 
        # it happens only ones in my model, 
        # so here I am in a row I want to change to inconsistent.
        cellRenderer.set_property('inconsistent',True) 
        # I was expecting that changes the box of that row but it affects every row. 

    else: 
        cellRenderer.set_property('inconsistent', False) # and that's ok now.

我得再试一次。 我想知道……我们真的必须手动执行此操作吗?难道它不能成为 treeView 的开箱即用功能吗?


可以通过使用单元格数据函数来设置一个元素的属性。由于我只在 C 中完成了此操作,因此我只能向您传递 PyGTK 文档的链接,我还没有看到 PyGObject 的此功能的相关文档。

对于 PyGTK 已记录here http://www.pygtk.org/docs/pygtk/class-gtktreeviewcolumn.html#method-gtktreeviewcolumn--set-cell-data-func, 页面底部为您提供了一个示例,PyGTK 的单元格数据函数的使用也被介绍在this http://www.pygtk.org/pygtk2tutorial/sec-CellRenderers.html#celldatafuncfig文档。

例如,如果您想执行与传输相同的操作,则可以执行以下操作: 由于您接收当前的迭代器作为单元格数据函数的参数,因此您可以循环遍历其所有子项并检查子项的状态。然后您就会知道要在父节点设置哪个状态。现在的要点是,在单元格数据函数内设置属性只会影响该单个单元格,而不是树视图的所有元素。

我还可以为您提供我自己的应用程序的直观示例:

我在此树视图中有“值”列。如果“菜单元素”列内的值设置为“启用”并且“类型”列内的值是“选项”,则显示一个复选框而不是文本(我已突出显示这样一行)。该示例图像还显示了活动搜索,其中突出显示了搜索结果。这两种情况都可以使用单元格数据函数来设置一个元素的属性,正如您在问题中所要求的那样。

Edit

我已经做了一些示例代码。要点是单元格属性始终是为每个单元格设置的。因此,不仅仅是“如果...,则设置属性”,而是“如果,这样设置属性,否则,这样设置属性”。 (它基于旧的 PyGTK 文档,但无论如何它应该澄清一些事情)。

#!/usr/bin/env python

# example basictreeview.py

import pygtk
pygtk.require('2.0')
import gtk

class BasicTreeViewExample:

    def set_status(self, column, cell, model, iter):
        if 'inconsistent' in model.get_value(iter, 0):
            cell.set_property('inconsistent',True) 
        else:
            cell.set_property('inconsistent',False)
        return

    def delete_event(self, widget, event, data=None):
        gtk.main_quit()
        return False

    def __init__(self):
        self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)

        self.window.set_title("Basic TreeView Example")

        self.window.set_size_request(200, 200)

        self.window.connect("delete_event", self.delete_event)

        self.treestore = gtk.TreeStore(str)

        for parent in range(4):
            piter = self.treestore.append(None, ['parent %i' % parent])
            for child in range(3):
                if child == 1:
                    self.treestore.append(piter, ['consistent'])
                else:
                    self.treestore.append(piter, ['inconsistent'])

        self.treeview = gtk.TreeView(self.treestore)

        self.tvcolumn0 = gtk.TreeViewColumn('Column 0')
        self.tvcolumn1 = gtk.TreeViewColumn('Column 1')

        self.treeview.append_column(self.tvcolumn0)
        self.treeview.append_column(self.tvcolumn1)

        self.text = gtk.CellRendererText()
        self.toggle = gtk.CellRendererToggle()

        self.tvcolumn0.pack_start(self.text, True)
        self.tvcolumn1.pack_start(self.toggle, True)

        self.tvcolumn0.add_attribute(self.text, 'text', 0)
        self.tvcolumn1.set_cell_data_func(self.toggle, self.set_status)

        self.window.add(self.treeview)

        self.window.show_all()

def main():
    gtk.main()

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

将 CellRendererToggle 的单行设置为不一致 的相关文章

  • 如何在多进程系统中实现锁定?

    我们正在并行运行许多詹金斯项目 我们使用 python 并且选择使用 pyenv 管理虚拟环境 不幸的是 pyenv 有一个众所周知的竞争条件 https github com yyuu pyenv issues 174 为了解决这个问题
  • 获取 .wav 文件长度或持续时间

    我正在寻找一种方法来找出 python 中音频文件 wav 的持续时间 到目前为止我已经了解了 pythonwave图书馆 mutagen pymedia pymad我无法获取 wav 文件的持续时间 Pymad给了我持续时间 但它不一致
  • 此 TypeError 消息中提到的“代码对象”是什么?

    在尝试使用Python时exec声明 我收到以下错误 TypeError exec arg 1 must be a string file or code object 我不想传递字符串或文件 但什么是代码对象 如何创建一个 创建代码对象的
  • Virtualenv 在 OS X Yosemite 上失败并出现 OSError

    我最近更新到 OSX Yosemite 现在无法使用virtualenv pip 每当我执行 virtualenv env 它抛出一个 OSError Command Users administrator ux env bin pytho
  • 无法在 selenium 和 requests 之间传递 cookie,以便使用后者进行抓取

    我用 python 结合 selenium 编写了一个脚本来登录网站 然后从driver to requests这样我就可以继续使用requests进行进一步的活动 I used item soup select one div class
  • 使用python从gst管道抓取帧到opencv

    我在用着OpenCV http opencv org 和GStreamer0 10 我使用此管道通过自定义套接字通过 UDP 接收 MPEG ts 数据包sockfd由 python 提供并显示它xvimagesink 而且效果很好 以下命
  • Python Tkinter 模块不显示输出

    我正在尝试学习 Python 并尝试使用 Python 中的 GUI 并遇到了这个 Tkinter 模块 我的代码运行 但运行时窗口没有出现 我的代码如下 from Tkinter import to create a root windo
  • Python HMAC:类型错误:字符映射必须返回整数、None 或 unicode

    我在使用 HMAC 时遇到了一个小问题 运行这段代码时 signature hmac new key secret key msg string to sign digestmod sha1 我收到一个奇怪的错误 File usr loca
  • Python将文本文件解析为嵌套字典

    考虑以下数据结构 HEADER1 key value key value HEADER2 key value key value HEADER3 key value HEADER4 key value key value 原始数据中没有缩进
  • Paste.httpserver 并通过 HTTP/1.1 Keep-alive 减慢速度;使用 httperf 和 ab 进行测试

    我有一个基于paste httpserver 的Web 服务器作为HTTP 和WSGI 之间的适配器 当我使用 httperf 进行性能测量时 如果每次使用 num conn 启动一个新请求 我每秒可以执行超过 1 000 个请求 如果我使
  • 使用 for 循环创建一系列元组

    我已经搜索过 但找不到答案 尽管我确信它已经存在了 我对 python 很陌生 但我以前用其他语言做过这种事情 我正在以行形式读取数据文件 我想将每行数据存储在它自己的元组中 以便在 for 循环之外访问 tup i inLine wher
  • pandas 相当于 np.where

    np where具有向量化 if else 的语义 类似于 Apache Spark 的when otherwise数据帧方法 我知道我可以使用np where on pandas Series but pandas通常定义自己的 API
  • 给定一个排序数组,就地删除重复项,使每个元素仅出现一次并返回新长度

    完整的问题 我开始在线学习 python 但对这个标记为简单的问题有疑问 给定一个排序数组 就地删除重复项 使得每个 元素只出现一次并返回新的长度 不分配 另一个数组的额外空间 您必须通过修改输入来完成此操作 数组就地 具有 O 1 额外内
  • 无法通过 Python 子进程进行 SSH

    我需要通过堡垒 ssh 进入机器 因此 该命令相当长 ssh i
  • 如何在亚马逊 EC2 上调试 python 网站?

    我是网络开发新手 这可能是一个愚蠢的问题 但我找不到可以帮助我的确切答案或教程 我工作的公司的网站 用 python django 构建 托管在亚马逊 EC2 上 我想知道从哪里开始调试这个生产站点并检查存储在那里的日志和数据库 我有帐户信
  • AWS Lambda 不读取环境变量

    我正在编写一个 python 脚本来查询 Qualys API 中的漏洞元数据 我在 AWS 中将其作为 lambda 函数执行 我已经在控制台中设置了环境变量 但是当我执行函数时 出现以下错误 module initialization
  • 如何将带有参数的Python装饰器实现为类?

    我正在尝试实现一个接受一些参数的装饰器 通常带有参数的装饰器被实现为双重嵌套闭包 如下所示 def mydecorator param1 param2 do something with params def wrapper fn def
  • rpy2 无法加载外部库

    希望有人能帮忙解决这个问题 R版本 2 14 1rpy2版本 2 2 5蟒蛇版本 2 7 3 一直在尝试在 python 脚本中使用 rpy2 加载 R venneuler 包 该包以 rJava 作为依赖项 venneuler 和 rJa
  • 如何使用 python 定位和读取 Data Matrix 代码

    我正在尝试读取微管底部的数据矩阵条形码 我试过libdmtx http libdmtx sourceforge net 它有 python 绑定 当矩阵的点是方形时工作得相当好 但当矩阵的点是圆形时工作得更糟 如下所示 另一个复杂问题是在某
  • python从二进制文件中读取16字节长的双精度值

    我找到了蟒蛇struct unpack 读取其他程序生成的二进制数据非常方便 问题 如何阅读16 字节长双精度数出二进制文件 以下 C 代码将 1 01 写入二进制文件三次 分别使用 4 字节浮点型 8 字节双精度型和 16 字节长双精度型

随机推荐

  • MySQL 根据前一行(同一列)更新列

    我有以下数据 ID Image 1 10 2 11 3 4 5 我想用之前行的值加一来更新缺失值 最终输出应该是 ID Image 1 10 2 11 3 12 4 13 5 14 更新的时候想过选择 但是不行 UPDATE items A
  • 如何仅使用JavaScript将base64编码的图像数据上传到S3?

    我在 Heroku cedar env 上有一个 Rails 应用程序 它有一个页面 我使用它将画布数据渲染到图像中toDataURL 方法 我正在尝试使用 JavaScript 将返回的 base64 图像数据字符串直接上传到 s3 绕过
  • 在 GCP 中指向并使用子域 [关闭]

    Closed 这个问题是与编程或软件开发无关 help closed questions 目前不接受答案 我有一个主域www example comAWS 上的 Route 53 中的设置 我想指点一下subdomain1 example
  • Grails 2.3.0 和 mysql 连接超时

    我有一个 Grails 2 2 3 应用程序 使用此配置连接到 mysql 数据库 production dataSource dbCreate update one of create create drop update url jdb
  • 导入错误:没有名为“paramiko”的模块

    我已经在这里完成了网上的其他问题 我觉得我的问题足够不同 值得提出一个新问题 所以我有一个Centos 6 box 它正在为我运行一个小网站 充当办公室 git 服务器 我正在尝试配置Python3 on it 所以我遵循以下这些步骤 ht
  • 不支持 Android 身份验证方案 ntlm

    我使用 asynchttpClient 进行基本身份验证 http loopj com android async http http loopj com android async http 那是 loj lib 下面是我的代码 用户名随
  • 数组中的元素太多!

    抱歉 如果这是一个菜鸟问题 一段C代码 int array 5 int cnt for cnt 0 cnt lt 10 cnt 1 array cnt cnt 应该会报错吧 不 工作正常 但这是为什么呢 看起来 在第一行 定义了一个大于双倍
  • Firebase 功能:在 stackdriver 控制台中使用 Winston 进行日志记录

    我无法使winston https github com winstonjs winston记录器写入日志堆栈驱动程序 https cloud google com logging 安慰 我将我的函数部署为 google firebase
  • 如何修复本机客户端错误“连接正忙于处理另一个命令的结果”?

    我得到了一个Connection Busy With Results From Another Command当 SSIS 包运行时 来自 SQL Server Native Client 驱动程序的错误 仅当与 SQLServer 200
  • Libgdx Scene2d - 设置演员( TextField )填充?

    我在设置填充或类似于演员的东西时遇到了麻烦 找不到路 我想我可能必须在皮肤中添加一些东西 我有这个文本字段 textboxskin new Skin textboxskin add textfieldback new Texture dat
  • 如何在android中使用XML布局在图像视图中为图像制作圆角

    我已经尝试了很多次 但我知道我错过了一些东西 你们能解释一下吗 以下是我尝试过的
  • 对象是空的吗? [复制]

    这个问题在这里已经有答案了 检查对象是否为空的最快方法是什么 有没有比这更快更好的方法 function count obj obj var i 0 for var key in obj i return i 对于 ECMAScript5
  • 避免非虚拟析构函数的对象切片

    我正在为智能指针编写代码作为练习 使用在线教程 1 http www davethehat com articles smartp htm 2 http www codeproject com Articles 15351 Implemen
  • 你能在 mdbg 中看到评估堆栈吗?

    假设我有以下 CIL ldc i4 40 lt a breakpoint is set here ldc i4 2 add box int32 call void mscorlib System Console WriteLine stri
  • 使用 Android 提交至 Google 电子表格表单

    第一次在这里提问 通常我不用问就能找到答案 但这一次我陷入了困境 无法弄清楚我错过了什么 我只是想让我的 Android 应用程序在网站上填写表格并提交 我不需要应用程序对发回的任何数据执行任何操作 只需填写表格并提交即可 基本上我正在尝试
  • Dalvik JIT 工作流程

    我对 dalvik vm Android 感兴趣 我试图通过 JIT 的代码来找出它执行的操作以及它如何选择跟踪 我无法遵循代码 因此 我请求所有人帮助我建议 JIT 中执行跟踪选择和翻译的相关函数 你可以尝试 git log grep J
  • 调用命令行程序的Web应用程序框架

    我们正在设计一个 Java EE Web 应用程序 在 tomcat 上运行 它旨在成为命令行程序的网络界面 是否有任何框架 应用程序允许这样做 即 JSP 页面将在内部向安装在与 Tomcat 服务器相同的服务器上的程序发出命令 命令行是
  • 左连接和左外连接的区别

    我想知道mySQL中的LEFT JOIN和LEFT OUTER JOIN是否有什么区别 如果没有区别那为什么会有两种不同的方式呢 提前致谢 它们是相同的 我认为您想要放入 外部 的唯一原因是为了清楚起见 为了澄清联接中的第一个表不需要它在第
  • extjs 面板适合布局

    我有一个面板 我正在将它渲染到一个容器中 我想要panel以适应containerheight 并且不想指定高度panel 但似乎不起作用 有什么办法可以做到吗 代码片段 div style width 100 height 100 div
  • 将 CellRendererToggle 的单行设置为不一致

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