2012-01-01 84 views
1

我有一个快速的问题,它听起来很愚蠢。但对于我的爱,我无法在网上或自己找到解决方案!我正在尝试为我自己制作一个使用python的FTP客户端,并且我试图在Tkinter中创建一个列表框,以显示FTP服务器上的所有文件名。但我无法显示文字!这里是我到目前为止下面的代码:Python 2.7 Tkinter和ftplib

# Import the FTP object from ftplib 
from ftplib import FTP 
from Tkinter import * 

app = Tk() 
app.title("FTP") 
app.geometry("300x500") 

def handleDownload(block): 
    file.write(block) 
    print ".", 

def login(): 
    ftp.login(username.get(),password.get()) 

    # This is where I am held up I tried ftp.retrlines('LIST') but it would 
    # not be inserted into to the list box instead it inserted "Tranfer Complete" at the end! 
    # Any suggetion? 
    h = ? 
    stuff = Listbox(app) 
    stuff.insert(END, h) 
    stuff.pack() 

    filename = "Steam Engine Poster.pdf" 

    Label(app, text ='Opening local file ' + filename).pack() 
    file = open(filename, 'wb') 

    Label(app, text = "Downloading Steam Engine Poster.pdf").pack() 

    ftp.retrbinary('RETR ' + filename, handleDownload) 

    Label(app, text = "Closing FTP connection!").pack() 

    ftp.close() 



ftp = FTP('sciphigames.com') 
Label(app, text = "Login").pack() 

username = StringVar(None) 
username = Entry(app, text = "Username: ") 
username.pack() 

password = StringVar(None) 
password = Entry(app, text = "Password: ") 
password.pack() 

button = Button(app, text = "Login!", command = login) 
button.pack() 

app.mainloop() 

回答

2

你得到“传输完成”,因为retrlines返回响应代码,而不是上市。如果您检查文档,您会看到除了该命令之外,还有第二个参数,即回调函数,将针对每个返回的行调用它。默认情况下,它只是将行打印到标准输出。

lines = [] 
def append_line(line): 
    lines.append(line) 
ftp.retrlines('LIST', append_line) 
+0

你会碰巧知道回电是什么吗? – user1114215 2012-01-01 14:54:13

+1

我已经添加了一些代码来解释如何做到这一点。你可以使它更加紧凑:'ftp.retrlines('LIST',lines.append)' – 2012-01-01 14:56:15

+0

注意:在示例代码中,'ftp.retrlines'返回后,'lines'包含一个列表,其中每个元素是一个FTP服务器回复的行数。现在,由您来处理它们:) – 2012-01-01 14:57:29