使用CellRendererToggle和List中的名称创建Gtk3 Treeview

时间:2016-08-05 16:09:37

标签: python gtk3

我尝试使用列表中的标题名称创建Gtk.TreeView。因为我想用它来显示来自不同数据库的条目。

问题: 当我单击一个单元格并尝试激活它时,行中的所有单元格都会被激活。更奇怪的是,只有当我将光标移到它们上面(而不是点击)时,它们看起来才会被激活。

此代码有什么问题?

#!/usr/bin/env python
#-*- coding: utf-8 -*-

import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
from gi.repository import Gdk


class CellRendererToggleWindow(Gtk.Window):

    def __init__(self):
        Gtk.Window.__init__(self, title="CellRendererToggle Example")
        self.set_default_size(400, 200)
        self.mainbox = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing = 10)
        self.add(self.mainbox)

        self.myliststore = Gtk.ListStore(bool,bool,str)
        self.treeview = Gtk.TreeView(self.myliststore)

        for n, header_text in enumerate(["Aktive", "Warning", "Text"]):
            if header_text in ["Aktive", "Warning"]:
                cell = Gtk.CellRendererToggle()
                cell.connect("toggled", self.on_sync_treeview_button_toggled, n, header_text )
                column = Gtk.TreeViewColumn(header_text, cell)
            else:
                cell = Gtk.CellRendererText()
                cell.set_property('editable', True)
                column = Gtk.TreeViewColumn(header_text, cell, text=n)
            column.set_sort_column_id(n)
            self.treeview.append_column(column)
        self.myliststore.append([True, True, "Super6!"])
        self.myliststore.append([True, True, "Super7!"])
        self.myliststore.append([True, True, "Super8!"])
        self.mainbox.pack_start(self.treeview, True, True, 0)

    def on_sync_treeview_button_toggled(self, widget, path, column, data):
        widget.set_active( [True,False][widget.get_active()] )


win = CellRendererToggleWindow()
win.connect("delete-event", Gtk.main_quit)
win.show_all()
Gtk.main()

2 个答案:

答案 0 :(得分:1)

TreeViewColumn需要一个“active”属性,其中包含商店中的位置:

column.add_attribute(cell, "active", n)

我还必须更改底层商店而不是小部件:

self.myliststore[path][column] = not self.myliststore[path][column]

感谢您的举例: https://github.com/Programmica/python-gtk3-tutorial/blob/master/_examples/cellrenderertoggle.py

现在它正在运作:

#!/usr/bin/env python
#-*- coding: utf-8 -*-

import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
from gi.repository import Gdk


class CellRendererToggleWindow(Gtk.Window):

    def __init__(self):
        Gtk.Window.__init__(self, title="CellRendererToggle Example")
        self.set_default_size(400, 200)
        self.mainbox = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing = 10)
        self.add(self.mainbox)

        self.myliststore = Gtk.ListStore(bool,bool,str)
        self.treeview = Gtk.TreeView(self.myliststore)

        for n, header_text in enumerate(["Aktive", "Warning", "Text"]):
            if header_text in ["Aktive", "Warning"]:
                cell = Gtk.CellRendererToggle()
                cell.connect("toggled", self.on_sync_treeview_button_toggled, n, header_text )
                column = Gtk.TreeViewColumn(header_text, cell)
                column.add_attribute(cell, "active", n)

            else:
                cell = Gtk.CellRendererText()
                cell.set_property('editable', True)
                column = Gtk.TreeViewColumn(header_text, cell, text=n)
            column.set_sort_column_id(n)
            self.treeview.append_column(column)
        self.myliststore.append([True, False, "Super6!"])
        self.myliststore.append([True, True, "Super7!"])
        self.myliststore.append([False, True, "Super8!"])
        self.mainbox.pack_start(self.treeview, True, True, 0)

    def on_sync_treeview_button_toggled(self, widget, path, column, data):
        self.myliststore[path][column] = not self.myliststore[path][column]


win = CellRendererToggleWindow()
win.connect("delete-event", Gtk.main_quit)
win.show_all()
Gtk.main()

答案 1 :(得分:0)

“选择一个单元格”的概念并未真正在GtkTreeView中实现。如果查看TreeView的所有可用功能,其中很少有真正解决单个单元格的问题。

这给你留下了这些选择:

  1. 实现您自己的“单细胞”突出显示(例如添加边框或更改背景颜色,例如通过添加更改细胞属性的额外列。

  2. 使用Gtk.Grid,其中'粒度'是一个单元格,但没有列标题的细节,以及一个很好的模型来加载数据。

  3. 另一种突出显示单元格(行已突出显示)的解决方案是更改相应列标题的颜色(或其他属性)。

  4. 这些选项都没有吸引力,每种方法都需要一些工作。