我正在寻找一种优雅的 pythonic 方式来将Gtk.ListStore
(Gtk.TreeView
的内容容器)的内容/模型连接到真实
数据。我需要双向"连接"。这意味着当我有一个Gtk.TreeIter
(例如来自select事件)时,我需要知道底层数据对象的标识符(不是Gtk.TreeModel
中的那个!) - 和visa-vi。
思考C-way我会将指针存储为链接到的隐藏列
Gtk.ListStore
的每个条目中的数据结构。但是我没有看到
这样做的方法。
数据只是list()
个dict()
离子的Gtk.ListStore
个read_status
个。关键在于
#!/usr/bin/env python3
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
from gi.repository import Pango
class Data:
def __init__(self):
self.theListA = list()
self.theListB = list()
# create the real data
for i in range(3):
self.theListA.append(
{
'title': 'The Title #{} A'.format(i),
'read_status': False
}
)
self.theListB.append(
{
'title': 'The Title #{} B'.format(i),
'read_status': False
}
)
class View(Gtk.TreeView):
def __init__(self, data):
# link to the real data
self.data = data
# content for the view
self.content = Gtk.ListStore.new([str, int])
# this example is to show that the content of the view can
# come from different data sources (here two list() objects)
data_list = self.data.theListA
data_list.extend(self.data.theListB)
# insert content to the view
for entry in data_list:
if entry['read_status'] is True:
font_weight = Pango.Weight.NORMAL
else:
font_weight = Pango.Weight.BOLD
self.content.append([entry['title'], font_weight])
# view
Gtk.TreeView.__init__(self, self.content)
col = Gtk.TreeViewColumn('Title',
Gtk.CellRendererText(),
text=0,
weight_set = True,
weight=1) # using the 2nd and hidden column
self.append_column(col)
# click event
select = self.get_selection()
select.connect("changed", self.on_tree_selection_changed)
def on_tree_selection_changed(self, selection):
model, treeiter = selection.get_selected()
if treeiter:
model[treeiter][1] = Pango.Weight.NORMAL
# HERE IS THE PROBLEM
#data_item['read_status'] = True
# how do I get the correct data item?
class Window(Gtk.Window):
def __init__(self):
Gtk.Window.__init__(self)
self.set_default_size(100, 120)
self.view = View(Data())
self.add(self.view)
self.connect('destroy', Gtk.main_quit)
self.show_all()
if __name__ == '__main__':
win = Window()
Gtk.main()
不仅代表一个数据列表,而且代表多个数据列表,或者仅代表多个数据列表的某些条目的选择。重要的是要
知道条目没有唯一的密钥。
想象一下新闻或邮件消息。如果Gtk.ListStore
,则字体为粗体
错误和否则。当我单击视图中的条目时,字体将从粗体修改为正常。但是数据列表中的条目也应该知道这一点!
id()
你如何解决这些问题?
我可以为每个数据列表条目创建唯一键并存储此键
在weakref
的隐藏列中。但这会炸毁
(实际)代码,并会导致我需要处理的其他一些问题。
什么是pythons {{1}}函数?这会是一种保存方式吗?或者{{1}}模块是什么?或者还有其他解决方案吗?