使用 CellRendererToggle 创建 Gtk3 Treeview 并使用 Python 从列表中创建名称
Create Gtk3 Treeview with CellRendererToggle and Names from List with Python
我尝试用列表中的 header 个名字创建一个 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()
'selecting a cell' 的概念并没有真正在 GtkTreeView
中实现。如果您查看所有可用于 TreeView 的函数,其中很少有真正针对单个单元格的。
剩下这些选项:
实现您自己的 'single cell' 突出显示(例如添加边框或更改背景颜色,例如通过添加额外的列来更改单元格的属性。
使用 Gtk.Grid
,其中 'granularity' 是一个单元格,但没有 header 列的优点,并且是一个很好的模型加载数据到.
另一种高亮单元格(该行已经高亮)的解决方案是改变相应列的颜色(或其他属性)header.
None的选项真的很吸引人,每个方法都需要一些工作。
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()
我尝试用列表中的 header 个名字创建一个 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()
'selecting a cell' 的概念并没有真正在 GtkTreeView
中实现。如果您查看所有可用于 TreeView 的函数,其中很少有真正针对单个单元格的。
剩下这些选项:
实现您自己的 'single cell' 突出显示(例如添加边框或更改背景颜色,例如通过添加额外的列来更改单元格的属性。
使用
Gtk.Grid
,其中 'granularity' 是一个单元格,但没有 header 列的优点,并且是一个很好的模型加载数据到.另一种高亮单元格(该行已经高亮)的解决方案是改变相应列的颜色(或其他属性)header.
None的选项真的很吸引人,每个方法都需要一些工作。
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()