2016-09-25 66 views
0

我与当前数据的文本文件:正确的ListStore添加元素蟒蛇

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() 

的问题是THA牛逼没有问题这样做:

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异常:行序列具有元素

的数量不正确

我做错了什么?

+1

你不能只在空间分裂。这将'Linux Kernel 1991 C'变成了4个元素的列表。 –

回答

0

好的,在data.txt中第9行是:

Linux Kernel 1991 C 

它包含4个元素。尝试:

Linux_Kernel 1991 C 

或者干脆:

Linux 1991 C 
0

这可能是因为通过data[0].split()返回的元素的数目比列的数目更大。换句话说,我认为你给4个或更多的元素连续行,而它只能接受3个元素。请逐步调试,找出您的程序出了什么问题。希望这会有所帮助。

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()显然只需要一个小区列表,甚至没有一个元组。