从单独的类修改tkinter画布

时间:2014-09-05 22:55:17

标签: python canvas python-3.x tkinter

我想要做的是创建一个类(Display),我可以在其中修改任何其他类的Canvas。

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:'Display'对象没有属性'create_text'

我知道我在Display中调用了一个名为'create_text'的函数,但我不知道如何在不继承它的情况下调用tkinter中的Canvas方法。我试图在Display中继承Canvas,我得到的错误是: TypeError:无法为基础对象Canvas

创建一致的方法解析顺序(MRO)

感谢所有帮助。

1 个答案:

答案 0 :(得分:1)

您可以直接访问对象属性,在这种情况下,您可以说

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

我上面做的另一个更改是你没有为create_text指定任何参数。但是,你会得到其他错误,但这不是问题所在。

但基本上,您应该重新考虑您的脚本结构。没有必要创建Mainprun类,并且通过字符串传递命令实际上不是一个好的决定。封装代码很好,但你有点过头了;)