Python 动态绘制到Tkinter画布对象时出现问题
一个问题:如何通过单击按钮动态绘制到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手册页面没有反映添加我可以找到的新对象的方法 代码:Python 动态绘制到Tkinter画布对象时出现问题,python,tkinter-canvas,Python,Tkinter Canvas,一个问题:如何通过单击按钮动态绘制到Tkinter画布对象 本主题最初由user339860(见1)作为两部分问题发布,但问题的第二部分尚未解决。我遇到了同样的问题,特别是我无法从按钮事件绘制到画布对象。回答这个问题将帮助两个人,我和用户339860;请看一看 应用程序创建两个位于左侧和右侧的框架,第二个框架包含画布对象。我在第一帧中有一个按钮绑定到一个名为drawRectangle的函数/方法。应用程序运行良好,它甚至使用create_rectangle方法在画布对象中绘制一个矩形,,直到您单
root=Tk() myApp=应用程序(主程序=根) root.title(“Tkinter测试!”) myApp.mainloop()
必须有一种方法来获取Tkinter Canvas对象用于更新自身的“损坏/修复显示模型”(参见3)的句柄。请帮助 参考资料:
没有对象“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范围,除非它有理由不属于(全局
,非局部
,…)。