2011-12-21 2 views
1

Hii У меня есть требование вызвать переменную в функции, которая имеет объявление и определение в другой функции. Может ли кто-нибудь мне помочь.Вызов переменной в python

import sys 
import os 
import tkMessageBox 
from Tkinter import * 
from tkCommonDialog import Dialog 
import shutil 
import tkFileDialog 
import win32com.client 

win = Tk() 
win.title("Copying the Directory to specified location") 
win.geometry("600x600+200+50") 
win.resizable() 
global src 
global des 
class Copy(): 
    #global src 
    #global des 
    def __init__(self): 
     def srce(): 
      src = tkFileDialog.askdirectory(title = "The source folder is ") 
      textboxsrc.delete(0,END) 
      textboxsrc.insert(0,src) 
      print src 
      return src 

     textboxsrc = Entry(win, width="70") 
     textboxsrc.insert(0,'Enter master file name') 
     textboxsrc.pack() 
     textboxsrc.place(relx=0.40, rely=0.06, anchor=CENTER) 
     bu = Button(text = "Source",font = "Verdana 12 italic bold",bg = "Purple",fg= "white", command= srce) 
     bu.pack(fill =X, expand=YES) 
     bu.place(relx=0.85, rely=0.06, anchor=CENTER) 

     def dest(): 
      des = tkFileDialog.askdirectory(title = "TheDestination folder is ") 
      textboxdes.delete(0,END) 
      textboxdes.insert(0,des) 
      print des 
      return des 

     textboxdes = Entry(win, width="70") 
     textboxdes.insert(0,'Enter master file name') 
     textboxdes.pack() 
     textboxdes.place(relx=0.40, rely=0.13, anchor=CENTER) 
     bu1 = Button(text = "Destination",font = "Verdana 12 italic",bg = "Purple",fg= "white", command= dest) 
     bu1.pack(fill =X, expand=YES) 
     bu1.place(relx=0.85, rely=0.13, anchor=CENTER) 

     def start(): 
      #global src 
      #global des 
      #abc = os.path.dirname(src) 
      #dgh = os.path.dirname(des) 
      try: 
       shutil.copy(src,des) 
      except : 
       tkMessageBox.showwarning("Copying file", "Error while copying\n(%s)") 

     bn =Button(text = "Copy",font = "Verdana 12 italic", bg = "Purple",fg= "white",command=start) 
     bn.pack(fill =X, expand = YES) 
     bn.place(relx=0.50, rely=0.25, anchor=CENTER) 

obj= Copy() 
#obj.source(win) 
#obj.destination(win) 
win.mainloop() 

Здесь я получаю сообщение об ошибке в функции start(). давая мне проблему принятия переменных src и des.

+0

Что вы имеете в виду "вызов переменной"? Переменная содержит ссылку на функцию? Можете ли вы опубликовать какой-то пример кода того, что вы пытаетесь сделать? – Cameron

+0

На самом деле я хочу, чтобы строка была назначена переменной в другой функции. –

+0

Вероятно, вы должны использовать глобальную переменную. Или ваша первая функция вернет значение этой переменной и передаст ее второй функции, которая ее требует. –

ответ

3

я обновил свой код (и внесение исправления, необходимые после прочтения вашей обратной связи) использовать переменный класс/атрибуты и фиксировал ваше сообщение об ошибке, проверьте его. Обратите внимание: использование переменных класса означает , вы можете использовать этот класс только как singleton, только один из этих классов может использоваться одновременно, потому что каждый экземпляр будет использовать те же Copy.src, Copy.des, Copy.textboxsrc и Copy .textboxdsc.

import sys 
import os 
import tkMessageBox 
from Tkinter import * 
from tkCommonDialog import Dialog 
import shutil 
import tkFileDialog 
import win32com.client 

win = Tk() 
win.title("Copying the Directory to specified location") 
win.geometry("600x600+200+50") 
win.resizable() 

# force "new" Python class by inheriting from "object" 
class Copy(object): 

    # use class attributes for shared variables 
    src = None 
    des = None 
    textboxsrc = None 
    textboxdes = None 

    def srce(): 
     # access the class attributes via "Copy." syntax 
     Copy.src = tkFileDialog.askdirectory(title = "The source folder is ") 
     Copy.textboxsrc.delete(0,END) 
     Copy.textboxsrc.insert(0,Copy.src) 
     print Copy.src 
     return Copy.src 

    textboxsrc = Entry(win, width="70") 
    textboxsrc.insert(0,'Enter master file name') 
    textboxsrc.pack() 
    textboxsrc.place(relx=0.40, rely=0.06, anchor=CENTER) 
    bu = Button(text = "Source",font = "Verdana 12 italic bold",bg = "Purple",fg= "white", command= srce) 
    bu.pack(fill =X, expand=YES) 
    bu.place(relx=0.85, rely=0.06, anchor=CENTER) 

    def dest(): 
     # access the class attributes via "Copy." syntax 
     Copy.des = tkFileDialog.askdirectory(title = "TheDestination folder is ") 
     Copy.textboxdes.delete(0,END) 
     Copy.textboxdes.insert(0,Copy.des) 
     print Copy.des 
     return Copy.des 

    textboxdes = Entry(win, width="70") 
    textboxdes.insert(0,'Enter master file name') 
    textboxdes.pack() 
    textboxdes.place(relx=0.40, rely=0.13, anchor=CENTER) 
    bu1 = Button(text = "Destination",font = "Verdana 12 italic",bg = "Purple",fg= "white", command= dest) 
    bu1.pack(fill =X, expand=YES) 
    bu1.place(relx=0.85, rely=0.13, anchor=CENTER) 

    def start(): 
     # access the class attributes via "Copy." syntax 
     print "copy src(%s) to des(%s)" % (Copy.src,Copy.des) 
     try: 
      shutil.copy(Copy.src,Copy.des) 
     except: 
      tkMessageBox.showwarning("Copying file", "Error while copying\n(%s) to (%s)\n%s\n%s" 
      % (Copy.src,Copy.des, sys.exc_info()[0], sys.exc_info()[1])) 


    bn =Button(text = "Copy",font = "Verdana 12 italic", bg = "Purple",fg= "white",command=start) 
    bn.pack(fill =X, expand = YES) 
    bn.place(relx=0.50, rely=0.25, anchor=CENTER) 

obj= Copy() 
win.mainloop() 
+0

Чувак Я получаю сообщение об ошибке как: "self не определено в self.src = tkFileDialog.askdirectory (title =" Исходная папка есть ")" –

+0

И когда передайте параметр self в srce, он дает мне ошибку следующим образом: srce() принимает ровно 1 аргумент (0 данный) –

+0

Извините за ошибку, я исправил код. Хотя я протестировал свое первоначальное решение, я допустил ошибку при публикации кода, извинения. Я тестировал вышеуказанный код, и он работает так же, как и для меня в Windows x86, используя дистрибутив ActiveState Python v2.7.2: http://www.activestate.com/activepython/downloads. –

1

Python предоставляет вложенные области (это может быть то, что вам нужно), но оно обеспечивает одну функцию доступом к локальным переменным другой функции на том же уровне. Если последнее то, что вам нужно, рассмотрите возможность использования глобальной переменной.

См. tutorial для обсуждения областей применения. Также см. Ссылку на язык для обсуждения global declarations.

В следующем примере, global используется для объявления переменной, которая может быть доступы и записаны в двух различных функций:

def f(): 
    global x 
    x = 1 

def g(): 
    global x 
    x = 2 

Ниже приведен пример вложенного объема, где внутренняя функция может читать но не писать переменную в функции включения:

def f(): 
    x = 1 
    def g(): 
     print(x) 
    return g 

в Python 3, был добавлен nonlocal ключевое слово для поддержки записи в х от внутренней функции:

def f(): 
    x = 1 
    def g(): 
     nonlocal x 
     x += 1 
    g() 
    print(x) 
+0

Я думаю, что показать, как использовать глобальный, на самом деле не указывает на него в правильном направлении. – wim

1

Скорее спасибо отвода вокруг с global ключевым словом, ваши методы класса должны быть связаны с родительским объектом. Похоже, вам действительно нужно проработать руководство по правилам обзора python.

class Copy(object): 
    def __init__(self): 
     # don't define further methods in here! 

    def srce(self): 
     self.src = ... 

    def dest(self): 
     self.des = .. 

    def start(self): 
     #Here you can access self.des and self.src 
+0

Исключение в обратном вызове Tkinter Traceback (последний последний вызов): Файл «C: \ Python27 \ lib \ lib-tk \ Tkinter.ру», линии 1410, в __call__ возврата self.func (* арг) TypeError: SRCE() занимает ровно 1 аргумент (0 дано) Это исключение, которое возникает, когда я использовал самостоятельной чувак Что. я должен был сделать это сейчас. Я был совершенно пуст в виду –

+0

Честно глядя на ваш код, я думаю, вы откусываете больше, чем можете пережевывать на этом этапе. Пройдите учебник, связанный с ответом @Raymond Hettinger, а также раздел 9 о классы http://docs.python.org/tutorial/classes.html – wim

0
import sys 
import os 
import tkMessageBox 
from Tkinter import * 
from tkCommonDialog import Dialog 
import shutil 
import tkFileDialog 
import win32com.client 

win = Tk() 
win.title("Copying the Directory to specified location") 
win.geometry("600x600+200+50") 
win.resizable() 


class Copy(object): 


    def __init__(self): 
     def srce(): 

      self.src = tkFileDialog.askdirectory(title="The source folder is ") 
      textboxsrc.delete(0, END) 
      textboxsrc.insert(0, self.src) 
      print self.src 
      return self.src 

     textboxsrc = Entry(win, width="70") 
     textboxsrc.insert(0, 'Enter master file name') 
     textboxsrc.pack() 
     textboxsrc.place(relx=0.40, rely=0.06, anchor=CENTER) 
     bu = Button(text="Source", font="Verdana 12 italic bold", bg="Purple", fg="white", command=srce) 
     bu.pack(fill=X, expand=YES) 
     bu.place(relx=0.85, rely=0.06, anchor=CENTER) 

     def dest(): 
      self.des = tkFileDialog.askdirectory(title="TheDestination folder is ") 
      textboxdes.delete(0, END) 
      textboxdes.insert(0, self.des) 
      print self.des 
      return self.des 

     textboxdes = Entry(win, width="70") 
     textboxdes.insert(0, 'Enter master file name') 
     textboxdes.pack() 
     textboxdes.place(relx=0.40, rely=0.13, anchor=CENTER) 
     bu1 = Button(text="Destination", font="Verdana 12 italic", bg="Purple", fg="white", command=dest) 
     bu1.pack(fill=X, expand=YES) 
     bu1.place(relx=0.85, rely=0.13, anchor=CENTER) 

     def start(): 


      try: 
       shutil.copytree(self.src, self.des) 
      except : 
       tkMessageBox.showwarning("Copying file", "Error while copying\n(%s)") 

     bn = Button(text="Copy", font="Verdana 12 italic", bg="Purple", fg="white", command=start) 
     bn.pack(fill=X, expand=YES) 
     bn.place(relx=0.50, rely=0.25, anchor=CENTER) 

obj = Copy() 
#obj.source(win) 
#obj.destination(win) 
win.mainloop()