一个问题:如何通过单击按钮动态绘制到 Tkinter Canvas 对象?
该主题最初由 user339860(参见 1)作为一个两部分问题发布,但该问题的第二部分尚未解决。我遇到了同样的问题,特别是我无法从按钮事件中绘制到 Canvas 对象。回答这个问题将帮助两个人,我自己和 user339860;请看一下。
应用程序创建左右两个框架,第二个框架包含 Canvas 对象。我在第一帧中有一个按钮,绑定到一个名为drawRectangle的函数/方法。该应用程序运行良好,它甚至使用create_rectangle方法在 Canvas 对象中绘制一个矩形,直到您单击该按钮。当您单击该按钮时,您会收到一条消息,其中包含以下内容;
tkinter_app_27Nov2010.py",第 25 行,drawRectangle self.myCan.create_rectangle(64,64,110,110,fill='blue') AttributeError: 'NoneType' object has no attribute '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 = Application(master=root) root.title("Tkinter 测试!") myApp.mainloop()
必须有一种方法来处理 Tkinter Canvas 对象用于更新自身的“损坏/修复显示模型”(参见 3)。请帮忙!
参考:
stackoverflow.com/questions/2824041/dynamically-add-items-to-tkinter-canvas
effbot.org/tkinterbook/canvas.htm#performance-issues