Форум сайта python.su
помогите пожалуйста исправить скрипт.
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()
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’
Офлайн
Ну, вообще-то ты пытаешься вызвать метод insert() у self.new, который, в зависимости от логики программы, может быть либо методом класса Operations, либо его же аттрибутом, экземпляром класса WorkArea (я от такой иезуитской логики чуть не поседел) В любом случае, твой класс WorkArea не является наследником tkinter.Text, а метод insert() ты ему не определяешь.
Для начала таки надо определиться, где ты вообще будешь хранить экземпляр tkinter.Text - в экземпляре класса WorkArea, или непосредственно в этом классе(что имхо глупо, но всяко лучше, чем в локальной переменной метода __init__)?
Соответственно, класс будет выглядеть как:
class WorkArea(): def __init__(self, parent): parent.title("My default workarea") self.workArea = tkinter.Text(parent) self.workArea.pack(expand = 'yes', fill = 'both')
class WorkArea(): def __init__(self, parent): parent.title("My default workarea") WorkArea.workArea = tkinter.Text(parent) WorkArea.workArea.pack(expand = 'yes', fill = 'both')
self.new.workArea.insert(tkinter.END, line)
Офлайн
zlodiak
Дам только одну рекомендацию: не пишите пока GUI с использованием классов.
Пройдет время и начнет все нормально получаться. Тогда и перепишите.
Ryoga Вы указали правильное решения, но потом от него ушли почему-то. Нужно сразу наследовать от tkinter.Text. Зачем делать единственный виджет еще и единственным атрибутом класса.
Также согласен относительно “переписать”. Класс из одного виджета выглядит жутко. Просто МЕГАжутко.
А этот код - это вообще абзец…
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')
Отредактировано 4kpt_II (Фев. 7, 2014 00:37:03)
Офлайн
ну спасибо. я можно сказать прозрел(относительно) после ваших ценных замечаний. очень много полезного понял
Отредактировано zlodiak (Фев. 7, 2014 09:14:04)
Офлайн
4kpt_II
Ryoga Вы указали правильное решения, но потом от него ушли почему-то. Нужно сразу наследовать от . Зачем делать единственный виджет еще и единственным атрибутом класса.
Также согласен относительно “переписать”. Класс из одного виджета выглядит жутко. Просто МЕГАжутко.
А этот код - это вообще абзец…
Отредактировано Ryoga (Фев. 7, 2014 10:44:46)
Офлайн
RyogaАга. С одним атрибутом
Ну, зачем-то класс он же свой создавал
Офлайн