回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p><em><strong>一个问题</strong></em>:如何从一个按钮点击动态绘制到Tkinter画布对象?在</p>
<p>这个主题最初是由user339860(参见1)作为一个由两部分组成的问题发布的,但是问题的第二部分还没有被解决。我也遇到了同样的问题,特别是<strong>我无法从按钮事件绘制到画布对象。回答这个问题将帮助两个人,我和用户339860;请看一看。在</p>
<p>应用程序创建两个左右定位的帧,第二个帧包含Canvas对象。我在第一帧中有一个按钮绑定到名为<em>drawRectangle</em>的函数/方法。应用程序运行良好,<strong>它甚至使用*create_rectangle*方法在画布对象中绘制一个矩形,直到您单击按钮。当你点击这个按钮时,你会得到一条信息:</p>
<blockquote>
<p>tkinter_app_27Nov2010.py", line 25, in drawRectangle
self.myCan.create_rectangle(64,64,110,110,fill='blue')
AttributeError: <strong>'NoneType' object has no attribute 'create_rectangle'</strong></p>
</blockquote>
<p>我认为这可能与Canvas对象的范围有关,所以我创建了一个<em>class level</em>的变量,设置为<em>None</em>,但这并没有解决问题。我考虑过Canvas<em>display list</em>(参见2),但是Tk手册页面并没有反映添加我可以找到的新对象的方法。在</p>
<h2>代码:</h2>
<hr/>
<pre><code># 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()
</code></pre>
<p>根=Tk()
myApp=应用程序(master=根)
根.title(“Tkinter测试!”)
myApp.mainloop()</p>
<hr/>
<p>必须有一种方法来处理Tkinter画布对象用来更新自身的“损坏/修复显示模型”(见3)。请帮忙!在</p>
<h2>参考文献:</h2>
<p>1.)stackoverflow.com/questions/2824041/dynamicy-将项目添加到tkinter画布</p>
<p>2.)www.tcl.tk/man/tcl8.4/TkCmd/canvas.htm\M16在</p>
<p>3.)efffbot.org/tkinterbook/canvas.htm性能问题</p>