Python 动态绘制到Tkinter画布对象时出现问题

Python 动态绘制到Tkinter画布对象时出现问题,python,tkinter-canvas,Python,Tkinter Canvas,一个问题:如何通过单击按钮动态绘制到Tkinter画布对象 本主题最初由user339860(见1)作为两部分问题发布,但问题的第二部分尚未解决。我遇到了同样的问题,特别是我无法从按钮事件绘制到画布对象。回答这个问题将帮助两个人,我和用户339860;请看一看 应用程序创建两个位于左侧和右侧的框架,第二个框架包含画布对象。我在第一帧中有一个按钮绑定到一个名为drawRectangle的函数/方法。应用程序运行良好,它甚至使用create_rectangle方法在画布对象中绘制一个矩形,,直到您单

一个问题:如何通过单击按钮动态绘制到Tkinter画布对象

本主题最初由user339860(见1)作为两部分问题发布,但问题的第二部分尚未解决。我遇到了同样的问题,特别是我无法从按钮事件绘制到画布对象。回答这个问题将帮助两个人,我和用户339860;请看一看

应用程序创建两个位于左侧和右侧的框架,第二个框架包含画布对象。我在第一帧中有一个按钮绑定到一个名为drawRectangle的函数/方法。应用程序运行良好,它甚至使用create_rectangle方法在画布对象中绘制一个矩形,,直到您单击该按钮。当你点击按钮时,你会看到一条信息,内容如下:

tkinter_app_27Nov2010.py”,第25行,绘图矩形 self.myCan.create_矩形(64,64110110,fill='blue') AttributeError:“非类型”对象没有属性“创建矩形”

我认为这可能与Canvas对象的作用域有关,所以我创建了一个类级变量,设置为None,但这并没有解决问题。我考虑了Canvas显示列表(请参见2),但Tk手册页面没有反映添加我可以找到的新对象的方法

代码:
root=Tk() myApp=应用程序(主程序=根) root.title(“Tkinter测试!”) myApp.mainloop()


必须有一种方法来获取Tkinter Canvas对象用于更新自身的“损坏/修复显示模型”(参见3)的句柄。请帮助

参考资料:
  • stackoverflow.com/questions/2824041/dynamicy-add-items-to-tkinter-canvas

  • effbot.org/tkinterbook/canvas.htm#性能问题


  • 没有对象“self.myCan”。您必须先将其创建为画布对象或其他任何对象,然后才能使用它。根据您的操作,您可能还必须调用update_idletasks()。

    没有对象“self.myCan”。您必须将其创建为画布对象或其他对象,然后才能使用它。您可能还必须调用update_idletasks()取决于您的操作。

    这是一个Python问题,而不是一个
    tkinter
    问题。您在
    createWidgets
    中定义了局部变量,但尚未将它们设置为实例属性。为此,您需要使用
    self.foo

    >>> class Foo:
    ...     def __init__(self):
    ...             bar = "baz"
    ...
    >>> class Bar:
    ...     def __init__(self):
    ...             self.bar = "baz"
    ...
    >>> foo = Foo()
    >>> foo.bar
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    AttributeError: Foo instance has no attribute 'bar'
    >>> bar = Bar()
    >>> bar.bar
    'baz'
    
    >>类Foo:
    …定义初始化(自):
    …bar=“baz”
    ...
    >>>分类栏:
    …定义初始化(自):
    …self.bar=“baz”
    ...
    >>>foo=foo()
    >>>美食酒吧
    回溯(最近一次呼叫最后一次):
    文件“”,第1行,在
    AttributeError:Foo实例没有属性“bar”
    >>>bar=bar()
    >>>酒吧
    “巴兹”
    

    请注意,您确实是正确的:问题在于
    画布的范围
    。或者更准确地说,是
    myCan
    变量的范围。如果您没有定义类变量
    myCan
    ,那么查找
    self.myCan
    将引发一个暴露的
    AttributeError

    ,这是一个Python问题,不是一个
    tkinter
    问题。您在
    createWidgets
    中定义了局部变量,但尚未将它们设置为实例属性。您需要使用
    self.foo

    >>> class Foo:
    ...     def __init__(self):
    ...             bar = "baz"
    ...
    >>> class Bar:
    ...     def __init__(self):
    ...             self.bar = "baz"
    ...
    >>> foo = Foo()
    >>> foo.bar
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    AttributeError: Foo instance has no attribute 'bar'
    >>> bar = Bar()
    >>> bar.bar
    'baz'
    
    >>类Foo:
    …定义初始化(自):
    …bar=“baz”
    ...
    >>>分类栏:
    …定义初始化(自):
    …self.bar=“baz”
    ...
    >>>foo=foo()
    >>>美食酒吧
    回溯(最近一次呼叫最后一次):
    文件“”,第1行,在
    AttributeError:Foo实例没有属性“bar”
    >>>bar=bar()
    >>>酒吧
    “巴兹”
    

    请注意,您确实是正确的:问题在于
    画布的范围
    。或者更准确地说,是
    myCan
    变量的范围。如果您没有定义类变量
    myCan
    ,那么查找
    self.myCan
    将引发一个揭示
    AttributeError

    属性的第二部分您引用为(1)的问题已得到回答。该问题的两部分都是由同一行代码引起的。在这种情况下,问题与您遇到的问题不同。您引用为(1)的问题的第二部分已回答。该问题的两部分都是由同一行代码引起的。在这种情况下,问题与您遇到的问题不同。谢谢您,Wooee!您和KatrieleAlex都是对的!正确使用self(self.myCan)是解决问题所需的全部。感谢您花时间回顾并发布您对此的见解。谢谢您,Wooee!您和KatrieleAlex都是对的!正确使用self(self.myCan)是解决此问题所需的全部。感谢您花时间审阅并发布您对此的见解。谢谢您,Katrielex!您的见解与Wooee一起完美地解决了此问题!我非常感谢您提供的示例,以便我能够更清楚地看到实例属性的正确应用。非常好!再次感谢。@code:没问题!一个普遍的经验法则是Python喜欢局部变量,除非它有理由不喜欢(
    global
    nonlocal
    ,…)。谢谢你,KatrieleAlex!你的洞察力和Wooee一起完美地解决了这个问题!我非常感谢你提供的示例,这样我就可以更清楚地看到实例属性的正确应用。非常好!再次感谢。@code:没问题!一般的经验法则是Python喜欢局部变量,并且它的所有内容都是局部的s范围,除非它有理由不属于(
    全局
    非局部
    ,…)。