- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在 Gtk+3 上,我使用 TreeModel
存储嵌套信息,并使用 CellRendererText
和 CellRendererToggle
显示它。用户可以点击每个切换按钮,当有嵌套按钮并且它们处于不同状态时,我希望上层按钮反射(reflect)“不一致”状态。我如何为一个元素设置这个属性?
为了更清楚,我想从 Transmission bittorrent 客户端实现的示例:
我知道如何使用 myCellRendererToggle.set_properties(inconsistent=True)
将单元格渲染器的所有按钮设置为不一致状态,但似乎我无法从这里访问一个元素;
我知道如何访问我的 TreeStore 模型的特定行,但我只能设置 «True» 和 «False» 值。
我的代码与官方文档非常接近,所以你可以帮助我: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()
谢谢!
编辑:回答 Marcus:我想不通,当我在函数内更改 CellRendererToggle 的属性时,它会更改每一行。
编辑解决方案:正如 Marcu 所指出的,我们必须在每种情况下都设置该属性,这就是我添加 else
部分的原因。
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 , this页面底部为您提供了一个示例,this 中还介绍了 PyGTK 的单元格数据函数的使用。文档。
例如,如果您想执行与传输中相同的操作,您可以执行以下操作:由于您收到当前迭代器作为单元格数据函数的参数,您可以在那里循环遍历它的所有子项并检查子项的状态。然后您将知道在父节点设置哪个状态。现在要点是,在单元格数据函数中设置一个属性只会影响这个单元格,而不是 TreeView 的所有元素。
我还可以为您提供我自己的应用程序的可视化示例:
我在此 TreeView 中有“值”列。如果“菜单元素”列内的值设置为“启用”并且“类型”列内的值是“选项”,则会显示一个复选框而不是文本(我已经突出显示了这样一行)。示例图像还显示了一个事件搜索,它突出显示了搜索结果。两者都可以使用单元格数据函数来设置您在问题中要求的一个元素的属性。
编辑
我已经完成了一些示例代码。要点是始终为每个单元格设置单元格属性。因此,不仅仅是“如果...,则设置属性”,而是“如果,像这样设置属性,否则,像那样设置属性”。 (它基于旧的 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()
关于python - 将 CellRendererToggle 的单行设置为不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14761389/
这个问题已经有答案了: Is there any way to accept only numeric values in a JTextField? (20 个回答) It's possible i
我使用戴尔 XPS M1710。笔记本电脑的盖子、侧面扬声器和前置扬声器都有灯(3 组灯可以单独调节)和鼠标垫下方的灯。在 BIOS 中,我可以更改这些灯的颜色,至少是每个组。另外,我可以在鼠标垫下打
我知道我可以使用 在 iOS 5 中打开设置应用 [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"prefs://"
我有一个 Django 应用程序,我正在尝试为其设置文档。目录结构如下: - doc - project | - manage.py 我已经设置了路径以便 Sphinx 可以看到东西,但是当我尝试使用
我正在使用 768mb ram 运行 centos 5.5。我一直在日志中获取 server reached MaxClients setting, consider raising the MaxC
我在具有以下配置的服务器内运行了 Drupal 安装: StartServers 5 MinSpareServers 5 MaxSpareServers 15 MaxClien
是否可以使用 Microsoft.Web.Administration 包为给定的 location 配置 asp 设置? 我想以编程方式将以下部分添加到本地 IIS applicationHost.
我一直在阅读为 kube-proxy 提供参数的文档,但没有解释应该如何使用这些参数。我使用 az aks create 创建我的集群使用 azure-cli 程序,然后我获得凭据并使用 kubect
我想知道与在 PHP 中使用 setcookie() 函数相比,在客户端通过 JavaScript 设置一些 cookie 是否有任何明显的优势?我能想到的唯一原因是减少一些网络流量(第一次)。但不是
我有一个按钮可以将 body class 设置为 .blackout 我正在使用 js-cookie设置cookie,下面的代码与我的按钮相关联。 $('#boToggle').on('click'
我有一堆自定义的 HTML div。我将其中的 3 存储在具有 slide 类的 div 中。然后,我使用该幻灯片类调用 slick 函数并应用如下设置: $('.slide').slick({
我正在创建一个应该在 Windows 8(桌面)上运行的应用 我需要: 允许用户使用我的应用启动“文件历史记录”。我需要找到打开“文件历史记录”的命令行。 我需要能够显示“文件历史记录”的当前设置。
我刚买了一台新的 MacBook Pro,并尝试在系统中设置 RVM。我安装了 RVM 并将默认设置为 ➜ rvm list default Default Ruby (for new shells)
由于有关 Firestore 中时间戳行为即将发生变化的警告,我正在尝试更改我的应用的初始化代码。 The behavior for Date objects stored in Firestore
在 ICS 中,网络 -> 数据使用设置屏幕中现在有“限制后台数据”设置。 有没有办法以编程方式为我的应用程序设置“限制后台数据”? 或 有没有办法为我的应用程序调出具有选项的“数据使用”设置? 最佳
我正在尝试使用 NextJS 应用程序设置 Jest,目前在 jest.config.js : module.exports = { testPathIgnorePatterns: ["/.n
我最近升级到 FlashDevelop 4,这当然已经将我之前的所有设置恢复到原来的状态。 我遇到的问题是我无法在新设置窗口的哪个位置找到关闭它在方括号、大括号等之前插入的自动空格的选项。 即它会自动
有没有办法以编程方式访问 iPhone/iPod touch 设置? 谢谢。比兰奇 最佳答案 大多数用户设置可以通过读取存储在 /User/Library/Preferences/ 中的属性列表来访问
删除某些值时,我需要选择哪些设置来维护有序队列。我创建了带有自动增量和主键的 id 的表。当我第一次插入值时,没问题。就像 1,2,3,4,5... 当删除某些值时,顺序会发生变化,例如 1,5,3.
我正在尝试设置示例 Symfony2 项目,如此处所示 http://symfony.com/doc/current/quick_tour/the_big_picture.html 在访问 confi
我是一名优秀的程序员,十分优秀!