Python Tkinter列表框不显示函数结果
我是Python新手,我正在尝试创建一个列表框,显示子目录中文件的名称 我已经知道了如何显示文件名,但只在shell上显示,我希望它们位于列表框中,这样用户可以选择一个文件,然后单击按钮在画布上显示其内容 有什么想法吗?这就是我到目前为止所做的:Python Tkinter列表框不显示函数结果,python,user-interface,listbox,tkinter,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(
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\u 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-and-insert-them”逻辑
尝试在画布上使用文本框来显示内容&请不要使用保留的内置符号…“文件”(在本例中)我会的,但首先我想在列表框中显示子目录的内容,知道怎么做吗?子目录的内容或目录中的所有文本文件?目录中的文本文件
listbox=Listbox(root,selectmode=BROWSE)
insert_books()