一个问题 :如何通过点击按钮动态绘制到Tkinter Canvas对象?
本主题最初由user339860(见1)发布,作为两部分问题,但问题的第二部分尚未解决。我遇到了同样的问题,特别是我无法从按钮事件中绘制到Canvas对象。回答这个问题将有助于两个人,我自己和用户339860;请看一下。
应用程序创建左右两个框架,第二个框架包含Canvas对象。我在第一帧中有一个按钮绑定到名为 drawRectangle 的函数/方法。应用程序运行正常,它甚至使用* create_rectangle *方法在Canvas对象中绘制一个矩形,直到您单击该按钮。单击该按钮时,您会收到包含以下内容的消息;
tkinter_app_27Nov2010.py",第25行,在drawRectangle中 self.myCan.create_rectangle(64,64,110,110,填充='蓝色') AttributeError:' NoneType'对象没有属性' create_rectangle'
我认为它可能与Canvas对象的范围有关,所以我创建了一个类级别变量设置为 None ,但是没有'解决问题。我想到了Canvas 显示列表(见2),但Tk手册页并没有反映出添加我能找到的新对象的方法。
# tkinter_app_27Nov2010.py
from Tkinter import *
class Application(Frame):
myCan = None
def createWidgets(self):
uiFrame = Frame(self,width=300,height=30)
uiFrame.configure(background='#e0e0e0')
uiFrame.grid(row=0,column=0,sticky=N+S)
outputFrame = Frame(self,width=300,height=300,background='#C0C0C0')
outputFrame.grid(row=0,column=1)
newBtn = Button(uiFrame,text="testing",command=self.drawRectangle)
newBtn.grid(row=0,column=0)
fillLbl = Label(uiFrame,text='-').grid(row=1,sticky=N+S)
newLBL = Label(outputFrame,text="another testing",background='#C0C0C0')
newLBL.grid(row=0)
myCan = Canvas(outputFrame,width=300,height=300,borderwidth=1,relief='sunken')
myCan.grid(row=1)
myCan.create_rectangle(34,34,50,50,fill='red')
def drawRectangle(self):
self.myCan.create_rectangle(64,64,110,110,fill='blue')
def __init__(self,master):
Frame.__init__(self,master)
self.pack()
self.createWidgets()
root = Tk() myApp =应用程序(master = root) root.title(" Tkinter测试!") myApp.mainloop()
必须有办法处理"损坏/修复显示模型" (参见3)Tkinter Canvas对象用于更新自身。请帮忙!
1。)stackoverflow.com/questions/2824041/dynamically-add-items-to-tkinter-canvas
2。)www.tcl.tk/man/tcl8.4/TkCmd/canvas.htm#M16
3。)effbot.org/tkinterbook/canvas.htm#performance-issues
答案 0 :(得分:2)
这是一个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'
请注意,您确实是正确的:问题与Canvas
的范围有关。或者更确切地说,使用myCan
变量的范围。如果您尚未定义类变量myCan
,则查找self.myCan
会引发一个透露AttributeError
。
答案 1 :(得分:1)
没有对象“self.myCan”。您必须先将其创建为画布对象或其他任何内容,然后才能使用它。您可能还必须根据您的操作调用update_idletasks()。