动态绘制到Tkinter画布对象的问题

2024-09-24 00:34:46 发布

您现在位置:Python中文网/ 问答频道 /正文

一个问题:如何从一个按钮点击动态绘制到Tkinter画布对象?在

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

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

tkinter_app_27Nov2010.py", line 25, in drawRectangle self.myCan.create_rectangle(64,64,110,110,fill='blue') AttributeError: 'NoneType' object has no attribute 'create_rectangle'

我认为这可能与Canvas对象的范围有关,所以我创建了一个class level的变量,设置为None,但这并没有解决问题。我考虑过Canvasdisplay list(参见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()

根=Tk() myApp=应用程序(master=根) 根.title(“Tkinter测试!”) myApp.mainloop()


必须有一种方法来处理Tkinter画布对象用来更新自身的“损坏/修复显示模型”(见3)。请帮忙!在

参考文献:

1.)stackoverflow.com/questions/2824041/dynamicy-将项目添加到tkinter画布

2.)www.tcl.tk/man/tcl8.4/TkCmd/canvas.htm\M16在

3.)efffbot.org/tkinterbook/canvas.htm性能问题


Tags: 对象方法selftkinter画布create按钮frame
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。在

没有对象”self.myCan公司". 在使用它之前,必须将其创建为画布对象或其他对象。根据您的操作,您可能还必须调用update_idletasks()。在

相关问题 更多 >