@zlodiak

Как вызвать объект из другого объекта?

помогите пожалуйста исправить скрипт.
import tkinter
import tkinter.messagebox
class Operations():
    def new(self, parent):
        global workArea
        if workArea == True:
            tkinter.messagebox.showwarning('Warning', 'New document is already open')
        else:    
            self.new = WorkArea(parent)
            workArea = True      
    
    def openFile(self):
        global workArea
        if workArea == True:
            tkinter.messagebox.showwarning('Warning', 'Close the open document')
        else:
            try:
                nameOpenFile = tkinter.filedialog.askopenfilename(title = 'Open textPad file', filetypes=[("textPad files", "*.tpd")])
            except Exception:
                pass
            else:
                try:
                    pointerFileOpened = open(nameOpenFile, 'rt')
                except Exception:
                    tkinter.messagebox.showerror('Error', 'Open file error')
                else:
                    self.new(root)
                    self.readFile(pointerFileOpened)
                finally:                        
                    pointerFileOpened.close()
    def readFile(self, pointerFileOpened):
        while True:
            line = pointerFileOpened.readline()
            if len(line) == 0:
                break
            else:
                self.new.insert(tkinter.END, line)  #this is problem line
        return
class WorkArea():
    def __init__(self, parent):
        parent.title("My default workarea")
        
        workArea = tkinter.Text(parent)
        workArea.pack(expand = 'yes', fill = 'both')
     
class ToolBar(Operations, tkinter.Frame):
    def __init__(self, parent):
        tkinter.Frame.__init__(self, parent)
        self.parent = parent  
        self.makeToolBar()
        
    def makeToolBar(self):
        frame = tkinter.Frame(self.parent)
        frame.pack(side = 'top', fill = 'x')
        
        tool1 = tkinter.Button(frame, text = 'New', command = lambda: self.new(root))
        tool1.pack(side = 'left')
        tool2 = tkinter.Button(frame, text = 'Open', command = lambda: self.openFile())
        tool2.pack(side = 'left')
workArea = False
root = tkinter.Tk()
root.geometry('900x500+200+100')
toolBar = ToolBar(root)
root.mainloop()


проблема в том, что поле того как пользователь нажимает кнопку “open” и выбирает файл для открытия, не происходит вывод содержимого файла на экран, а происходит вывод следующего сообщения об ошибке:

File “C:\Python33\projects\TEXTPADS\textPad_OOP\q.py”, line 32, in openFile
self.readFile(pointerFileOpened)
File “C:\Python33\projects\TEXTPADS\textPad_OOP\q.py”, line 42, in readFile
self.new.insert(tkinter.END, line) #this is problem line
AttributeError: ‘WorkArea’ object has no attribute ‘insert’


если можно, то помогите пожалуйста переписать класс WorkArea правильным образом.
  • Вопрос задан
  • 2791 просмотр
Решения вопроса 1
sheknitrtch
@sheknitrtch
Видимо вы только недавно начали изучать программирование. Во первых стоит перевести на русский язык сообщение об ошибке и попробовать понять, что именно не нравится интерпретатору. Во вторых, используйте Google прежде чем задавать вопросы. И в третьих, не стоит вставлять кусок программы и ожидать, что кто-то будет читать ваш код и пытаться в нём разобраться.

Ваша ошибка состоит в том, что вы пытаетесь вызвать метод insert для класса "WorkArea". Но этого класса нет такого метода. У него есть только метод __init__. Видимо должен быть вызван метод insert у класса tkinter.Text ?
Я исправил класс WorkArea из вашего примера:
https://gist.github.com/anonymous/8851536
Проверить не могу, так как у меня не установлен tkinter.
Замечания:
  1. Использование глобальной булевой переменной workArea - плохая практика
  2. Имя переменной workArea почти совпадает с именем класса WorkArea - плохая практика, их легко перепутать и получить много весёлых сообщений об ошибках
  3. Выражение self.new = ... заменяет метод "new" на объект. Не стоит называть метод и поле одним именем.
  4. Непонятно, зачем класс ToolBar наследует два других класса. Мне кажется, что можно объеденить классы "Operations" и "TooBar" в один, который наследовал бы tkinter.Frame.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы