2015-05-14 3 views
0

Вот моя проблема, я создаю Tkinter GUI и в объекте класса я призываю текст прочит в текстовом поле и сделать массив егоPython: получить значение объектов, от объекта класса

Но Я не могу найти способ получения и использования этого объекта позже в скрипте.

Вот мой сценарий

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 из объекта Class? Также возможно ли распечатать myarray с помощью кнопки «Пуск» без необходимости сначала использовать кнопку «Процесс»?

##### EDIT

Вот окончательный рабочий сценарий благодаря помощи

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) 
+0

Этот код не работает. Можете ли вы редактировать в остальной части кода, чтобы сделать это возможным? – ballsatballsdotballs

+0

Извините, я не добавил импорт Теперь он отредактирован –

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

Это не совсем то, что я ищу, поскольку процесс будет делать и другие вещи, чем просто печать myarray. Вот почему я ищу, как создать еще одну кнопку, которая будет вызывать только myarray Так что, по-видимому, нет другого способа получить myarray для чего-то, чем добавить весь фрагмент скрипта, который обрабатывает myarray в GrapgGUI? –

+0

@ Jérémz, если 'GraphGUI.clicked' возвращает' myarray', тогда вы можете получить к нему доступ с помощью 'app.clicked', независимо от того, что еще он делает. В качестве альтернативы вы можете определить 'myarray' как свойство класса. Я отредактирую. –

+0

Большое спасибо Адаму, он сделал трюк для меня, даже если мне пришлось изменить мелочь, чтобы заставить кнопку работать (см. В редакции). Хотя я действительно не понимаю, как работает @property, могу добавить столько свойств для класс, как я хочу, и все ли они независимы? –

1

Вы пытаетесь получить доступ к локальной переменной в методе объекта, который вы просто не можете сделать.

Что вы можете сделать то, что, что другой метод вернуть объект, или вы можете преобразовать эту локальную переменную в переменную экземпляра.

Простейшим решением является функция возвращает данные, которые вы хотите:

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

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

Спасибо, Брайан, ваш метод работает над мной, но дает многократный возврат массива. см. в edit для метода, который дает лучший результат для меня –

Смежные вопросы