Tkinter列表框不显示功能结果

时间:2013-12-11 10:54:03

标签: python user-interface listbox tkinter

我是Python新手,我正在尝试创建一个列表框,显示子目录中文件的名称。

我已经弄清楚如何显示文件的名称,但只在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()

1 个答案:

答案 0 :(得分: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

(*或者,你可以使用 yield 语句创建一个生成器,但是因为你刚刚学习我们会尽可能地保持这个简单)

第三,要插入多个项目,必须将它们作为不同的参数传递给函数。 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-并插入它们“逻辑。

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