gpt4 book ai didi

python - Tkinter 列表框不显示函数结果

转载 作者:太空宇宙 更新时间:2023-11-03 18:41:01 24 4
gpt4 key购买 nike

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

我已经弄清楚如何显示文件的名称,但仅限于外壳,我希望它们位于列表框中,因此用户可以选择一个文件,然后单击一个按钮以在 Canvas 。

有什么想法吗?这是我到目前为止所拥有的:

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

最佳答案

您的代码中有几个问题:

首先,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()

关于python - Tkinter 列表框不显示函数结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20517207/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com