Python:检索对象';类对象中的值

Python:检索对象';类对象中的值,python,class,tkinter,Python,Class,Tkinter,这是我的问题,我正在创建一个Tkinter GUI 在一个类对象中,我调用文本字段中的一个文本,并将其生成一个数组 但是我找不到以后在脚本中如何检索和使用这个对象 这是我的剧本 import pandas as pd from pandas import * import numpy as np import Tkinter from Tkinter import * from pylab import * from ttk import * import ScrolledText df =

这是我的问题,我正在创建一个Tkinter GUI 在一个类对象中,我调用文本字段中的一个文本,并将其生成一个数组

但是我找不到以后在脚本中如何检索和使用这个对象

这是我的剧本

import pandas as pd
from pandas import *
import numpy as np
import Tkinter
from Tkinter import *
from pylab import *
from ttk import *
import ScrolledText

df = pd.DataFrame(np.random.randint(100, 500, size = (10, 20)), index = list('abcdefghij'))
    mylist = df.index.values.tolist()

    rootWin = Tkinter.Tk()
    class GraphGUI():
        def __init__(self, rootWin):
            self.textfield = ScrolledText.ScrolledText(rootWin, width=30, height=10)
            #Add some text:
            self.textfield.insert(INSERT, "Replace")
            self.textfield.grid(column=0, row=4)

            self.button = Button(rootWin, text="Process!", command=self.clicked)
            self.button.grid(column=1, row=4)


        def clicked(self):
            eText = self.textfield.get('1.0', END)
            converted = eText.encode('ascii','ignore')
            myarray = converted.splitlines()
            print(myarray)


    def clicked2():
        print(clicked.myarray)

    start = Tkinter.Button(rootWin, text="start!", command=clicked2).grid(column=7, row=8)

    app = GraphGUI( rootWin )
    rootWin.mainloop()
问题是,当我单击“处理”按钮时,没有问题myarray会被打印出来。 但是当我使用开始按钮时,我无法检索它。 有没有办法从类对象中检索myarray? 是否可以使用“开始”按钮打印myarray,而不必先使用“处理”按钮

#####编辑 这里是最后的工作脚本,感谢您的帮助

class GraphGUI():
    def __init__(self, rootWin):
        self.textfield = ScrolledText.ScrolledText(rootWin, width=30, height=10)
        #Add some text:
        self.textfield.insert(INSERT, "Replace by your Accession list")
        self.textfield.grid(column=6, row=4)

        self.button = Button(rootWin, text="Process!", command=self.clicked)
        self.button.grid(column=7, row=4)

    @property
    def myarray(self):
        e_Text = self.textfield.get('1.0', END)
        converted = e_Text.encode('ascii','ignore')
        return converted.splitlines()

    def clicked(self):
        print(self.myarray)
        print(variablea.get())    #not defined here#
        print(variableb.get())

def clicked2():
    print(app.myarray)

start = Tkinter.Button(rootWin, text="start!", command=clicked2).grid(column=7, row=10)

看起来您正在尝试访问对象方法的局部变量。那是不可能的。如果需要,请尝试将其定义为自己的回调

class GraphGUI():

    def __init__(self, rootWin):
        self.textfield = ScrolledText.ScrolledText(rootWin,
                                                   width=30,
                                                   height=10)
        # Add some text:
        self.textfield.insert(INSERT, "Replace")
        self.textfield.grid(column=0, row=4)

        self.button = Button(rootWin, text="Process!", command=self.clicked)
        self.button.grid(column=1, row=4)

    def clicked(self):
        eText = self.textfield.get('1.0', END)
        converted = eText.encode('ascii', 'ignore')
        myarray = converted.splitlines()
        return myarray

rootWin = Tkinter.Tk()

app = GraphGUI(rootWin)
start = Tkinter.Button(rootWin, text="start!", command=app.clicked)
start.grid(column=7, row=8)  # your code assigned `start = None` btw
rootWin.mainloop()
或者,
myarray
可以定义为类的属性

class GraphGUI():
    ...

    @property
    def myarray(self):
        e_txt = self.textfield.get('1.0', END)
        converted = e_txt.encode('ascii', 'ignore')
        return converted.splitlines()

    def clicked(self):
        print(self.myarray)
        # do whatever else it has to do


rootWin = Tkinter.Tk()
start = Tkinter.Button(rootWin, text="Start!",
                       command=lambda: app.myarray)
...

您试图访问对象方法中的局部变量,但这是您无法做到的

您可以做的是,另一个方法返回对象,或者您可以将该局部变量转换为实例变量

最简单的解决方案是让函数返回所需的数据:

class GraphGUI():
    ...
    def clicked(self):
        ...
        return myarray

def clicked2():
    myarray = app.clicked()
    print("myarray:", myarray)

此代码不运行。你能在代码的其余部分进行编辑以使其可运行吗?很抱歉,我没有添加导入,它现在被编辑了。你的缩进看起来像是搞糟了。你能修好它吗?顺便说一下--请尽量避免modulename导入中的
*
。这会导致一些令人难以置信的名称空间被污染。这并不是我想要的,因为这个进程除了打印myarray之外还会做其他事情。这就是为什么我在寻找如何创建另一个只调用myarray的按钮的原因。显然,除了添加在GrapGui中处理myarray的整个脚本之外,没有其他方法可以检索myarray,然后,您可以使用
应用程序访问它。单击
无论它执行其他操作。或者,您可以将
myarray
定义为类的属性。我会编辑。非常感谢Adam,它为我做到了这一点,即使我必须改变一点东西才能使按钮工作(请参见编辑部分),尽管我并不真正了解@property的工作原理。我可以为一个类添加任意多的属性吗?它们都是独立的吗?@Jérémz属性只是像属性一样的函数。如果您没有
@属性
decorator,则必须使用
app.myarray()
而不是
app.myarray
访问它。因为这看起来像是我的一个属性,所以我称之为属性。谢谢Bryan,你的方法对我有效,但是给数组返回多次时间。请参见编辑中提供最佳结果的方法