Виджет Python clist не возвращает ожидаемый список, возвращает только первый символ каждого элемента

Я написал простую программу для вывода всех не скрытых файлов и подкаталогов в данном каталоге.

Сейчас я пытаюсь перенести свой код в пример виджета clist, который я нашел в Google. Помимо удаления некоторых ненужных кнопок, я изменил только верхнюю часть, чтобы интегрировать свой код, и он частично работает, за исключением того, что он возвращает только первый символ каждого файла и подкаталога. Так что я ожидал этого:

Desktop
Downloads
Scripts
textfile.txt
pron.avi

Но вместо этого получил это:

D
D
S
t
p

Вот пример с кодом, который я изменил (действительно только первое определение)

import gtk, os

class CListExample:
    # this is the part Thraspic changed (other than safe deletions)
    # User clicked the "Add List" button.
    def button_add_clicked(self, data):
        dirList=os.listdir("/usr/bin")
        for item in dirList: 
           if item[0] != '.':
              data.append(item)
        data.sort()
        return


    def __init__(self):
        self.flag = 0
        window = gtk.Window(gtk.WINDOW_TOPLEVEL)
        window.set_size_request(250,150)

        window.set_title("GtkCList Example")
        window.connect("destroy", gtk.mainquit)

        vbox = gtk.VBox(gtk.FALSE, 5)
        vbox.set_border_width(0)
        window.add(vbox)
        vbox.show()

        scrolled_window = gtk.ScrolledWindow()
        scrolled_window.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_ALWAYS)

        vbox.pack_start(scrolled_window, gtk.TRUE, gtk.TRUE, 0)
        scrolled_window.show()

        clist = gtk.CList(1)

        # What however is important, is that we set the column widths as
        # they will never be right otherwise. Note that the columns are
        # numbered from 0 and up (to an anynumber of columns).
        clist.set_column_width(0, 150)

        # Add the CList widget to the vertical box and show it.
        scrolled_window.add(clist)
        clist.show()

        hbox = gtk.HBox(gtk.FALSE, 0)
        vbox.pack_start(hbox, gtk.FALSE, gtk.TRUE, 0)
        hbox.show()
        button_add = gtk.Button("Add List")
        hbox.pack_start(button_add, gtk.TRUE, gtk.TRUE, 0)

        # Connect our callbacks to the three buttons
        button_add.connect_object("clicked", self.button_add_clicked,
clist)

        button_add.show()

        # The interface is completely set up so we show the window and
        # enter the gtk_main loop.
        window.show()

def main():
    gtk.mainloop()
    return 0

if __name__ == "__main__":
    CListExample()
    main()

person Fruckubus Crunt    schedule 23.07.2011    source источник
comment
добро пожаловать в SO, +1 для pron.avi   -  person Uku Loskit    schedule 23.07.2011
comment
Что вы получите, если будете print data в верхней части метода? print dirlist строка после этого? print item в верхней части петли? Дайте нам отладочную информацию.   -  person agf    schedule 23.07.2011
comment
Обратите внимание, что gtk.CList устарел, начиная с GTK 2.0, и полностью удален из GTK 3.0. Вместо этого вы должны использовать gtk.TreeView.   -  person ptomato    schedule 24.07.2011
comment
@ptomato Спасибо за совет, большое спасибо, потому что кажется, что я могу получить больше информации о саморазвитии для TreeView. Считается ли нормальным в stackoverflow задним числом +1 ответ после достижения 15 очков повторения?   -  person Fruckubus Crunt    schedule 25.07.2011
comment
@Fruckubus: да, вы можете голосовать за что угодно, даже спустя годы - все голосования анонимны.   -  person ptomato    schedule 25.07.2011


Ответы (1)


Когда вы добавляете данные в CList с помощью метода append, вы должны передать последовательность. Перепишите свой код:

def button_add_clicked(self, data):
    dirList = os.listdir("/usr/bin")
    for item in dirList: 
       if not item.startswith('.'):
          data.append([item])
    data.sort()

При создании экземпляра CList вы передаете конструктору количество столбцов. В вашем примере вы создали CList с одним столбцом, поэтому вы можете видеть только первый элемент (первый символ) переданной последовательности в методе добавления.

person simplylizz    schedule 23.07.2011
comment
Всем спасибо, решение Simplylizz работает, и я рад, что не ошибся. agf: спасибо за подсказку, я буду публиковать отладочную информацию в будущем по умолчанию. - person Fruckubus Crunt; 24.07.2011