Tkinter列表框不显示函数resu

2024-10-04 03:28:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我是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()

Tags: 文件textimportosrootopenlabelpack
1条回答
网友
1楼 · 发布于 2024-10-04 03:28:26

您的代码有几个问题:

首先,booknames = (open_book)没有创建图书列表。它只是返回一个对名为“open_book”的函数的引用。您需要做的是调用函数,如下所示:

booknames = open_book()

其次,open_book函数需要返回值,而不是打印出来。例如:

^{pr2}$

(*或者,您可以使用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-and-insert-them”逻辑。在

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

相关问题 更多 >