Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 向ListStore添加行不工作-异常_Python_Python 3.x_Gtk3_Gobject Introspection - Fatal编程技术网

Python 向ListStore添加行不工作-异常

Python 向ListStore添加行不工作-异常,python,python-3.x,gtk3,gobject-introspection,Python,Python 3.x,Gtk3,Gobject Introspection,首先是守则: from gi.repository import Gtk, GtkSource, GObject import os.path import shelve class MusicCollection(object): def __init__(self): self.builder = Gtk.Builder() self.glade_file = 'music.glade' GObject.type_register

首先是守则:

from gi.repository import Gtk, GtkSource, GObject

import os.path
import shelve

class MusicCollection(object):

    def __init__(self):
        self.builder = Gtk.Builder()
        self.glade_file = 'music.glade'
        GObject.type_register(GtkSource.View)
        self.builder.add_from_file(self.glade_file)
        self.window = self.builder.get_object("window1")
        self.entry_author = self.builder.get_object("entry_author")
        self.entry_album = self.builder.get_object("entry_album")
        self.entry_songs = self.builder.get_object("entry_songs")
        self.borrowed_toggle = self.builder.get_object("borrowed")
        self.create_button = self.builder.get_object("create")
        self.update_button = self.builder.get_object("update")
        self.delete_button = self.builder.get_object("destroy")
        self.view = self.builder.get_object("treeview1")
        self.albums_list = self.builder.get_object("albums_list")

        self.db = shelve.open("data.db")
        self.columns = ["Author", "Album", "Songs", "Borrowed"]        

        self.connect_signals()
        self.initialize()
        self.window.show_all()

    def connect_signals(self):
        self.create_button.connect("clicked", self.create)
        self.update_button.connect("clicked", self.update)
        self.delete_button.connect("clicked", self.destroy)
        self.window.connect("destroy", self.quit)
        self.view.get_selection().connect("changed", self.changed)

    def initialize(self):
        try:
          self.albums = self.db['albums']
        except KeyError:
          self.db["albums"] = []
          self.db.sync()

        self.albums = self.db['albums']

        for i in range(len(self.albums)):
            self.albums_list.append(self.albums[i])

        for i in range(len(self.columns)):
            cell = Gtk.CellRendererText()
            col = Gtk.TreeViewColumn(self.columns[i], cell, text=i)
            self.view.append_column(col)

    def update(self, button):
        (instance, iterator) = self.view.get_selection().get_selected()
        newItem = (self.entry_author.get_text(),self.entry_album.get_text(),self.entry_songs.get_text(), self.borrowed_toggle.get_mode())
        i = self.albums_list.get_path(iterator)[0]
        self.albums.pop(i)
        self.albums.insert(i,newItem)
        instance[iterator][0] = self.entry_author.get_text()
        instance[iterator][1] = self.entry_album.get_text()
        instance[iterator][2] = self.entry_songs.get_text()
        instance[iterator][3] = self.borrowed_toggle.get_mode()
        self.db['albums'] = self.albums
        self.db.sync()


    def destroy(self, selection):
        (instance, iterator) = self.view.get_selection().get_selected()
        toDel = instance[iiterator][0]
        i = self.albums_list.get_path(iterator)[0]
        self.albums_list.remove(iterator)
        self.albums.pop(i)

        self.db['albums'] = self.albums
        self.db.sync()

    def create(self, somtin):
        new_entry = (self.entry_author.get_text(),self.entry_album.get_text(),self.entry_songs.get_text(), self.borrowed_toggle.get_mode())
        print(new_entry)
        self.albums.append(new_entry)
        self.db['albums'] = self.albums
        self.db.sync()
        self.albums_list.append(new_entry)


    def changed(self, selection):
        (instance, iterator) = selection.get_selected()
        self.entry_author.set_text(instance[iterator][0])
        self.entry_album.set_text(instance[iterator][1])
        self.entry_songs.set_text(instance[iterator][2])
        self.borrowedto.set_mode(instance[iterator][3])

    def quit(self, elem):
        self.db.close()
        Gtk.main_quit()

if __name__ == "__main__":
    collection = MusicCollection()
    Gtk.main()
每次对ListStore对象执行.append()操作时,都会出现以下错误:

Traceback (most recent call last):
  File "./music.py", line 85, in create
    self.albums_list.append(new_entry)
  File "/usr/lib/python3/dist-packages/gi/overrides/Gtk.py", line 945, in append
    return self._do_insert(-1, row)
  File "/usr/lib/python3/dist-packages/gi/overrides/Gtk.py", line 936, in _do_insert
    row, columns = self._convert_row(row)
  File "/usr/lib/python3/dist-packages/gi/overrides/Gtk.py", line 844, in _convert_row
    result.append(self._convert_value(cur_col, value))
  File "/usr/lib/python3/dist-packages/gi/overrides/Gtk.py", line 862, in _convert_value
    return GObject.Value(self.get_column_type(column), value)
  File "/usr/lib/python3/dist-packages/gi/overrides/GObject.py", line 214, in __init__
    self.init(value_type)
TypeError: Must be gobject.GType, not gobject.GType

当然,ListStore对象是(str,str,str,boolean)类型。错误消息很荒谬,有人能告诉我发生了什么吗?

问题是我在定义列类型时使用了python类型名,而不是GTK类型名。 我将它设置为(str,str,str,bool),但它应该是(gchararray,gchararray,gchararray,gboolean)