2013-12-11 4 views
1

Я новичок в Python, и я пытаюсь создать список, который показывает имя файлов в подкаталоге.Tkinter listbox не отображает результат функции

Я выяснил, как отображать имя файлов, но только на оболочке, и я хочу, чтобы они были внутри списка, поэтому пользователь может выбрать файл, а затем нажать кнопку, чтобы отобразить его содержимое на холст.

Любые идеи? это то, что я до сих пор:

import os 
import fnmatch 
from Tkinter import * 


root=Tk() 
root.title("Reader") 


def open_book(): 
    for file in os.listdir("/txtbooks"): 
     if fnmatch.fnmatch(file, '*.txt'): 
      print file 


OpenBook=Button(root, text="Open Book",command=open_book) 


booknames=(open_book) 
listbox=Listbox(root,selectmode=BROWSE) 
listbox.insert(END,booknames) 


label= Label(root, text="Select a book") 
label.pack() 
listbox.pack() 
OpenBook.pack() 

can=Canvas(root,width=500,height=300) 
scrollbar=Scrollbar(root) 
scrollbar.pack(side=RIGHT,fill=Y) 
can.pack() 


mainloop() 
+0

пытается использовать текстовое поле на холсте для отображения содержимого – Gogo

+0

& пожалуйста, постарайтесь не использовать зарезервированные встроенные символы ... «файл» (в данном случае) – Gogo

+0

я буду, но сначала я хочу показать содержимое подкаталога в списке, любую идею, как это сделать? – user3090712

ответ

1

У вас есть несколько проблем в вашем коде:

Во-первых, booknames = (open_book) не создает список книг. Он просто возвращает ссылку на функцию с именем «open_book». Что вам нужно сделать, это вызов функции, например, так:

booknames = open_book() 

Во-вторых, ваша функция open_book нужно возвращение значений, а не печатать их. Например:

def open_book(): 
    books = [] 
    for file in os.listdir("/txtbooks"): 
     if fnmatch.fnmatch(file, '*.txt'): 
      books.append(file) 
    return books 

(* поочередно, вы можете использовать выход о создать генератор, но так как вы только учитесь, мы будем держать это так просто, как это возможно)

В-третьих, для вставки нескольких элементов вы должны передать их функции как различные аргументы. Python имеет синтаксис для этого: поставить * перед список, чтобы развернуть список, прежде чем функция называется:

listbox.insert(END,*booknames) 

выше имеет тот же эффект, как если бы вы сделали это:

for book in booknames: 
    listbox.insert(END, book) 

Наконец , у вас есть логическая проблема. Вы пытаетесь вызвать функцию open_book как при запуске, так и с помощью кнопки. Возможно, это именно то, что вы намереваетесь, но функция должна работать по-разному в каждом контексте. В случае вызова его при запуске, вы хотите, чтобы он вернулся список книг. Чтобы использовать его с помощью кнопки, нажмите . Вставьте книги в списке.

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

def insert_books(): 
    books = open_book() 
    listbox.delete(0, "end") 
    listbox.insert("end", *books) 

button = Button(..., command=insert_books) 

Конечно, когда у вас есть функция insert_books, вы должны использовать, что в обоих местах (при условии, что вы хотите сделать это в обоих местах), так что вы не дублировать " get-a-list-of-books-and-insert-them ".

listbox=Listbox(root,selectmode=BROWSE) 
insert_books() 
Смежные вопросы