2013-02-27 4 views
0

Я собираюсь программировать графический интерфейс в Python 2.7.3 с использованием Tkinter. У меня есть главное меню (A в примере) и окно (B). A содержит список, B делает то, что требует содержимого списка в A. После того, как B закончил свою работу, мне нужен метод в A (doSomething). Мой упрощен код выглядит следующим образом:Python/Tkinter терпит неудачу, когда классы вызывают методы друг друга

#!/usr/bin/env python 

import Tkinter as tk 

class A(object): 
    def __init__(self, root): 
     self.__mainMenu = root 
     self.__LB = tk.Listbox(self.__mainMenu) 
     self.__LB.pack() 
     self.__LB.insert(tk.END, "foo") 
     b = B(self.__mainMenu, self.__LB) 

    def doSomething(self): 
      print "Ham and spam!" 

class B(object): 
    def __init__(self, mainMenu, LB): 
     self.__mainMenu = mainMenu 
     self.__LB = LB 
     print self.__LB.get(0) 
     self.__mainMenu.doSomething() 

def main(): 
    root = tk.Tk() 
    gui = A(root) 
    root.mainloop() 

main() 

Следующий вывод производится:

$ ./myTest.py 
foo 
Traceback (most recent call last): 
    File "./myTest.py", line 29, in <module> 
    main() 
    File "./myTest.py", line 26, in main 
    gui = A(root) 
    File "./myTest.py", line 11, in __init__ 
    b = B(self.__mainMenu, self.__LB) 
    File "./myTest.py", line 21, in __init__ 
    self.__mainMenu.doSomething() 
    File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1767, in __getattr__ 
    return getattr(self.tk, attr) 
AttributeError: doSomething 

Где эта ошибка взялось? Почему ошибка настолько плохая?

ответ

2

Я всегда использую GTK (без опыта работы с Tk), но от того, что я вижу, вы вызываете метод DoSomething корня, а не класса А в Б. INIT .__ mainMenu.doSomething()
Invoke B с self in A init:

b = B(self, self.__LB) 
+0

Мне так стыдно ... Было поздно ночью! :-) Спасибо, это решило. – user1488553

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