在Python中使用全局变量

时间:2012-01-02 14:29:52

标签: python listbox tkinter python-2.7

我正在使用Tkinter来帮助我构建一个FTP客户端,在这个客户端我试图从tk列表框中获取所选信息。所以我有一个开始下载的按钮但是它出现的原因是错误“

Exception in Tkinter callback
Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk/Tkinter.py", line 1410, in __call__
    return self.func(*args)
  File "/Volumes/LEGO FLASH/ftp.py", line 23, in Download
    filename = stuff
NameError: global name 'stuff' is not defined" 

下面我有代码供您查看:

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

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

lines = []
#[lines.replace(",", "\n")for lines in lines]
#lines = lines.replace(',','\n')

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

def append_line(line):
    lines.append(line)

#This is where I am caught-------> 
def Download():

    filename = stuff

    file = open(filename, 'wb')

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


    ftp.close()

def login():
    try:
        ftp.login(username.get(),password.get())
    except:
        error = Label(app, text = "Invalid USERNAME OR PASSWORD")


    label2 = Label(app, text = "Welcome to Steam Engine").pack()
    username.forget()
    password.forget()
    button.forget()

    app.geometry("800x500")

    download = Button(app, text = "Download!!!!!", command = Download)
    download.pack(side = "left", pady = "5")

    scrollBar.pack(fill = Y, side = "right", padx = "2")

    #ftp.cwd('The_Store')

    stuff = Listbox(app, height = "700", width = "500")
    ftp.retrlines('NLST', append_line)
    for i in lines:
        stuff.insert(END, i)
    stuff.pack(padx = "10", pady = "10")

    stuff.config(yscrollcommand = scrollBar.set)
    scrollBar.config(command = stuff.yview)



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

scrollBar = Scrollbar(app)

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

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

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

app.mainloop()

任何帮助将不胜感激!

谢谢!

3 个答案:

答案 0 :(得分:1)

#This is where I am caught-------> 
def Download():

    filename = stuff

这里有什么东西?它不是一个全局变量,它似乎是login的参数,而不是Download方法的参数。

如果你想stuff一个全局变量(可能不是更好的选择),请使用global statement

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

# define the global stuff
global stuff

...
def Download():

    global stuff

    filename = stuff

...

更好的方法是在所有这些::

周围创建一个对象
class NetworkApp(object):
   def login(self):
      # here put all the previous code of login

      # here we change the callback to self.Download
      download = Button(app, text = "Download!!!!!", command = self.Download)

      # here we're creating a stuff member
      self.stuff = Listbox(app, height = "700", width = "500")


    def Download(self):
        filename = self.stuff  # here we use the stuff member
        file = open(filename, 'wb')
        ftp.retrbinary('RETR ' + filename, handleDownload)
        ftp.close()
#...
net_app = NetworkApp()
button = Button(app, text = "Login!", command = net_app.login)

答案 1 :(得分:0)

我不完全确定您的stuff变量的目的是什么,但您遇到的问题可能源于您使用它的方式。

首先,您将它用作login的参数(顺便说一下,它不应该参数)。您可以从login函数指定此变量,并在Download函数中引用另一个具有相同名称的变量。

同样,不确定我对你想要对stuff变量做什么的理解,我会尝试类似

.....

app.geometry("300x300")

stuff = None # <<<<----

lines = []

.....

#This is where I am caught-------> 
def Download():
    global stuff # <<<<----

    filename = stuff

    ......

    ftp.close()

def login():
    global stuff # <<<<----

    ......

    stuff = Listbox(app, height = "700", width = "500")
    ftp.retrlines('NLST', append_line)
    for i in lines:
        stuff.insert(END, i)
    stuff.pack(padx = "10", pady = "10")

    stuff.config(yscrollcommand = scrollBar.set)
    scrollBar.config(command = stuff.yview)


......

答案 2 :(得分:0)

您需要做的就是将“全局”放在变量前面

global var1