将Gtk.ListStore链接到真实数据

时间:2018-06-01 12:56:19

标签: python python-3.x treeview gtk pygobject

我正在寻找一种优雅的 pythonic 方式来将Gtk.ListStoreGtk.TreeView的内容容器)的内容/模型连接到真实 数据。我需要双向"连接"。这意味着当我有一个Gtk.TreeIter(例如来自select事件)时,我需要知道底层数据对象的标识符(不是Gtk.TreeModel中的那个!) - 和visa-vi。

思考C-way我会将指针存储为链接到的隐藏列 Gtk.ListStore的每个条目中的数据结构。但是我没有看到 这样做的方法。

数据只是list()dict()离子的Gtk.ListStoreread_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}}模块是什么?或者还有其他解决方案吗?

0 个答案:

没有答案