2016-09-25 93 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()顯然只需要一個小區列表,甚至沒有一個元組。