2013-12-11 70 views
1

我是新來的Python,我試圖創建一個列表框,顯示子目錄中的文件的名稱。Tkinter列表框不顯示函數結果

我已經弄清楚如何顯示文件的名稱,但只在shell上,我希望它們在列表框中,所以用戶可以選擇一個文件,然後單擊一個按鈕以顯示它的內容一個畫布。

任何想法?這是我到目前爲止有:

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功能,您應該使用在兩個地方(假設你想這樣做,在這兩個地方),這樣就不會複製「得到一本書籍和插入它們「的邏輯。

listbox=Listbox(root,selectmode=BROWSE) 
insert_books()