Python:检索对象';类对象中的值
这是我的问题,我正在创建一个Tkinter GUI 在一个类对象中,我调用文本字段中的一个文本,并将其生成一个数组 但是我找不到以后在脚本中如何检索和使用这个对象 这是我的剧本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 =
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,你的方法对我有效,但是给数组返回多次时间。请参见编辑中提供最佳结果的方法