Python:从类对象中检索对象的值

时间:2015-05-14 04:00:20

标签: 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 = 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打印。 但是,当我使用开始按钮时,我无法检索它。 有没有办法从Class对象中检索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)

2 个答案:

答案 0 :(得分:1)

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

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)
...

答案 1 :(得分:1)

您正试图访问对象方法中的局部变量,而这是您根本无法做到的。

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

最简单的解决方案是让函数返回您想要的数据:

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

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