2014-12-07 5 views
0

По какой-то причине я не могу получить запись из дочернего окна. Я хочу получить запись из дочернего окна, а затем нарисую прямоугольник. ошибка, что я получаю: х = поплавок (self.txtSide.get()) AttributeError: объект 'MainWindow' не имеет атрибут 'txtSide'Получение записи из дочернего окна?

import tkinter as tk 
import turtle 
tu=turtle 


class MainWindow(tk.Frame): 
    def __init__(self, *args, **kwargs): 
     tk.Frame.__init__(self, *args, **kwargs) 
     self.button = tk.Button(self, text="Cupe",command=self.Cupe) 
     self.button.pack(side="top") 

    def Cupe(self): 

     c = tk.Toplevel(self) 
     c.wm_title("Cupe") 

     lab=tk.Label(c,text="Side") 
     lab.pack() 

     c.txtSide=tk.Entry(c) 
     c.txtSide.pack() 


     button=tk.Button(c,text="Graph",command=self.graphCupe) 
     button.pack(side="bottom") 


    def graphCupe(self): 
     x=float(self.txtSide.get()) 
     tu.forward(x) 
     tu.left(90) 
     tu.forward(x) 
     tu.left(90) 
     tu.forward(x) 
     tu.left(90) 
     tu.forward(x) 

if __name__ == "__main__": 
    root = tk.Tk() 
    main = MainWindow(root) 
    main.pack(side="top", fill="both", expand=True) 
    root.mainloop() 

ответ

1

Проблема заключается в том, что self в graphCupe относится к MainWindow экземпляр, а не дочернее окно. Вам нужно будет передать дочернее окно в функцию graphCupe. Это будет один из способов сделать это:

def Cupe(self): 
     ... 
     button=tk.Button(c,text="Graph",command=lambda: self.graphCupe(c)) 
     button.pack(side="bottom") 

    def graphCupe(self,window): 
     x=float(window.txtSide.get()) 
     ... 

Теперь функция graphCupe принимает окно, необходимое для работы на, а кнопка вызывает функцию и передает ему свое дочернее окно.

+0

Другое решение, конечно же, должно сделать 'txtSide' атрибутом' self' ('self.txtSide = ...') –

+0

Это также сработает, но если откроется другое дочернее окно, оно перезапишет атрибут. Затем, если дочернее окно 1 пытается вызвать 'graphCupe()', он будет использовать атрибут 'txtSide' из дочернего окна 2. –