2014-09-05 3 views
0

Что я хочу сделать, это создать класс (Display), где я могу изменить Canvas из любого другого класса.Изменение холста tkinter из отдельного класса

from tkinter import * 

#--------# Main #--------# 

class Main(): 
    def Setup(self): 
     Display('makeCanvas') 
     prun('Setup') 

#--------# Display #--------# 

class Display(object): 
    def __init__(self, cmd):   
     win = Tk() 
     win.geometry('500x500') 
     self.winCanvas = Canvas(master=win) 

     if(cmd == 'makeCanvas'): 
      self.winCanvas = Canvas(width=500, height=500) 
     elif(cmd == 'startLoop'): 
      mainloop() 
     elif(cmd == 'getCanvas'): 
      self.sendCanvas() 
     else: 
      print('Failed') 

     self.winCanvas.pack() 
    def sendCanvas(self): 
     return self.winCanvas 

#--------# ConsolePrint #--------# 

class ConsolePrint(Display, object): 

    def __init__(self, text_given): 
     self.tx_g = text_given 
     self.totalText = '' 
     self.canvas = Display('getCanvas') 

----> self.textFeild = self.canvas.create_text() 

    def Console(self): 
     print("Console") 
     self.totalText += (self.tx_g + '\n') 
     self.textFeild.append(text=('Console: ' + self.totalText)) 
     self.textFeild.pack() 

class prun(object): 
    def __init__(self, text_given): 
     print("Printing") 
     printer = ConsolePrint(str('*Running: ' + str(text_given) + '*')) 
     print("Now the Console") 
     printer.Console() 

Main().Setup() 

Его эта строка кода, которая не не работает: self.textFeild = self.canvas.create_text()

Ошибка, которая приходит есть: AttributeError: 'Дисплей' объект не имеет attribute 'create_text'

Я знаю, что я вызываю функцию «create_text» в Диске, но я не знаю, как вызвать метод Canvas в tkinter, не наследуя его. Я попытался наследовать Canvas в Display, и ошибка, которую я получаю: TypeError: Не удается создать согласованный порядок разрешения метода (MRO) для объекта базы, Canvas

Вся помощь приветствуется.

+1

эй, вы неправильно указали поле :) – W1ll1amvl

ответ

1

Вы можете получить прямой доступ атрибуты объекта, в данном случае, вы могли бы просто сказать

class ConsolePrint(...): 
    def __init__(...): 
     ... 
     self.textField = self.canvas.winCanvas.create_text(0, 0, text="Whatever") 

Другое изменение, которое я сделал выше, что вы не указали никаких параметров для create_text. Однако вы получите другие ошибки, но это не вопрос.

Но в основном вы должны переосмыслить структуру своего скрипта. Нет необходимости создавать классы Main и prun, и передача команд через строки действительно не является хорошим решением. Код капсулирования хорош, но вы немного переусердствовали;)

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