Использование глобальных переменных в Python - PullRequest
0 голосов
/ 02 января 2012

Я использую 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 ]

1 голос
/ 02 января 2012
#This is where I am caught-------> 
def Download():

    filename = stuff

что здесь за вещи ??это не глобальная переменная, похоже, это параметр login, но не метода Download.

Если вы хотите сделать stuff глобальной переменной (вероятно, не лучший выбор), используйте глобальный оператор .

# 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)
0 голосов
/ 17 декабря 2013

Все, что вам нужно сделать, это поместить "global" перед переменной

global var1
0 голосов
/ 02 января 2012

Я не совсем уверен, какова цель вашей переменной 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)


......
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...