我有一个包含当前数据的文本文件:
Firefox 2002 C++
Eclipse 2004 Java
Pitivi 2004 Python
Netbeans 1996 Java
Chrome 2008 C++
Filezilla 2001 C++
Bazaar 2005 Python
Git 2005 C
Linux Kernel 1991 C
GCC 1987 C
Frostwire 2004 Java
我想从我的python程序中读取它并将其添加到ListStore中以获得类似的内容
http://i.stack.imgur.com/fqnvM.png
这是我的代码:
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
filename = 'data.txt'
with open(filename) as f:
data = f.readlines()
class TreeViewFilterWindow(Gtk.Window):
def __init__(self):
Gtk.Window.__init__(self, title="Treeview Filter Demo")
self.grid = Gtk.Grid()
self.grid.set_column_homogeneous(True)
self.grid.set_row_homogeneous(True)
self.add(self.grid)
self.software_liststore = Gtk.ListStore(str, str, str)
self.software_liststore.append(data[0].split())
self.software_liststore.append(data[10].split())
i=0
while (i<(len(data))):
print(data[i].split())
self.software_liststore.append(data[i].split())
i=i+1
self.treeview = Gtk.TreeView(model=self.software_liststore)
for i, column_title in enumerate(["Software", "Release Year", "Programming Language"]):
renderer = Gtk.CellRendererText()
column = Gtk.TreeViewColumn(column_title, renderer, text=i)
self.treeview.append_column(column)
self.scrollable_treelist = Gtk.ScrolledWindow()
self.scrollable_treelist.set_vexpand(True)
self.grid.attach(self.scrollable_treelist, 0, 0, 8, 10)
self.scrollable_treelist.add(self.treeview)
self.show_all()
win = TreeViewFilterWindow()
win.connect("delete-event", Gtk.main_quit)
win.show_all()
Gtk.main()
问题在于这样做没有问题:
self.software_liststore.append(data[0].split())
self.software_liststore.append(data[10].split())
但是当我尝试使用while循环插入数据时,它会说:
Traceback (most recent call last):
File "tut20.py", line 83, in <module>
win = TreeViewFilterWindow()
File "tut20.py", line 68, in __init__
self.software_liststore.append(data[i].split())
File "/usr/lib/python2.7/dist-packages/gi/overrides/Gtk.py", line 956, in append
return self._do_insert(-1, row)
File "/usr/lib/python2.7/dist-packages/gi/overrides/Gtk.py", line 947, in _do_insert
row, columns = self._convert_row(row)
File "/usr/lib/python2.7/dist-packages/gi/overrides/Gtk.py", line 849, in _convert_row
raise ValueError('row sequence has the incorrect number of elements')
ValueError:行序列的元素数量不正确
我做错了什么?
答案 0 :(得分:0)
好的,data.txt中的第9行是:
Linux Kernel 1991 C
包含4个元素。尝试:
Linux_Kernel 1991 C
或简单地说:
Linux 1991 C
答案 1 :(得分:0)
这可能是因为data[0].split()
返回的元素数量大于列数。换句话说,我认为你给一行4个或更多元素,而它只能接受3个元素。请逐步调试,找出你的程序有什么问题。希望这会有所帮助。
答案 2 :(得分:0)
这听起来像正则表达式。
使用Python的re
正则表达式模块。
import re
self.software_liststore = Gtk.ListStore(str, str, str)
p = r"(?P<software>.+?)\s+(?P<release_year>\d{4})\s+(?P<programming_language>.+?)\r?\n"
for line in data:
match = re.match(p, line)
if match:
print match.group('software'), match.group('release_year'), match.group('programming_language')
self.software_liststore.append([match.group('software'), match.group('release_year'), match.group('programming_language')])
另外,请注意,software_liststore.append()显然只包含一个单元格列表,甚至不包含元组。