Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Tkinter列表框不显示函数结果_Python_User Interface_Listbox_Tkinter - Fatal编程技术网

Python Tkinter列表框不显示函数结果

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(

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

您的代码中有几个问题:

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