2013-12-17 2 views
0

У меня есть следующая проблема: в моем главном окне tk у меня есть кнопка, которая открывает новое окно Toplevel. После нажатия кнопки в окне Toplevel следует добавить новый элемент в список.Python: импорт ошибок. Доступ к методу из другого класса

Я получаю сообщение об ошибке:

Traceback (most recent call last): 
    File "MainWindow.py", line 4, in <module> 
    from TopWindow import TopWindow 
    File "TopWindow.py", line 4, in <module> 
    import MainWindow 
    File "MainWindow.py", line 4, in <module> 
    from TopWindow import TopWindow 
ImportError: cannot import name TopWindow 

Я считаю, что проблема заключается в том, что оба класса импорта друг друга. Однако я не знаю, как это исправить. Есть идеи?

Mainwindow.py:

from TopWindow import TopWindow 

class MainWindow: 
    def __init__(self, mainWindow): 
     self.value = '' 
     self.gui(mainWindow) 
    def gui(self, mainWindow): 
     top = TopWindow() 
     button = tk.Button(optionFrame, text="Open TopWindow", command=top.import) 
     ... 

    def addtolistbox(self): 
     .... 


mainWindow = tk.Tk() 
run = MainWindow(mainWindow) 
mainWindow.mainloop() 

TopWindow.py

import MainWindow 
class TopWindow: 
    def import(self): 
     .... 
     MainWindow.MainWindow().addtolistbox() 
+0

определение функции импорта (сам): 'я думаю, что это ваша проблема. это должно быть __init __() –

+0

Является ли выбор именования смешным? – 6502

ответ

1

Вы создали круговую импорт; при импорте MainWindow из TopWindow класс TopWindow еще не определен, поэтому модуль TopWindow, как видно по MainWindow, не имеет этого атрибута.

Отложите импорта в TopWindow классе:

class TopWindow: 
    def import(self): 
     .... 
     import MainWindow 
     MainWindow.MainWindow().addtolistbox() 

Далее, вы создаете новую копию MainWindow объекта каждый раз; Вы, вероятно, хотите получить доступ к одноплодному объекту, созданный в MainWindow.run вместо:

class TopWindow: 
    def import(self): 
     .... 
     import MainWindow 
     MainWindow.run.addtolistbox() 
+0

Спасибо! Это действительно исправляет ошибку импорта. Однако теперь у меня другая проблема. Вызывая MainWindow.MainWindow(). Addtolistbox(), я создаю новый Mainwindow вместо простого обновления списка в существующем окне. Я не хочу создавать новый MainWindow, но функцию, вызванную в MainWindow, для обновления существующей. Как мне это сделать? – user3111516

+0

Кроме того, новый MainWindow больше не находится в mainloop. Я получаю TypeError: __init __() принимает ровно 2 аргумента (1 данный) – user3111516

+0

@ user3111516: Возможно, вы хотели использовать 'MainWindow.run.addtolistbox()' вместо этого? Вы уже создали свой основной объект окна в этом модуле. –

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