Задача динамического рисования на объекте Tkinter Canvas - PullRequest
0 голосов
/ 27 ноября 2010

Один вопрос : Как вы динамически рисуете объект Tkinter Canvas при нажатии кнопки?

Эта тема была изначально опубликована пользователем339860 (см. 1)как вопрос из двух частей, но вторая часть вопроса еще не рассмотрена.У меня такая же проблема, в частности Я не могу нарисовать объект Canvas из события кнопки .Получить ответ на этот вопрос помогут два человека, я и user339860;пожалуйста, посмотрите.

Приложение создает два кадра, расположенных слева и справа, второй кадр содержит объект Canvas.У меня есть кнопка в первом кадре, связанная с функцией / методом с именем drawRectangle .Приложение работает нормально, оно даже рисует прямоугольник в объекте Canvas, используя метод * create_rectangle * , пока вы не нажмете кнопку.Когда вы нажимаете кнопку, вы получаете сообщение со следующим:

tkinter_app_27Nov2010.py ", строка 25, в drawRectangle self.myCan.create_rectangle (64,64,110,110, fill = 'blue') AttributeError: Объект 'NoneType' не имеет атрибута 'create_rectangle'

Я подумал, что это как-то связано с областью действия объекта Canvas, поэтому я создал уровень классаПеременная установлена ​​в Нет , но это не решило проблему. Я думал о списке отображения 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 ()


Должен быть способ получить представление о« модели отображения повреждений / исправлений »(см. 3), которую объект Tkinter Canvas использует для обновления самого себяПожалуйста, помогите!

Ссылки:

1.) Stackoverflow.com/questions/2824041/динамически добавлять элементы в tkinter-canvas

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

3.) effbot.орг / tkinterbook / canvas.htm # производительность вопросы

Ответы [ 2 ]

2 голосов
/ 28 ноября 2010

Это проблема 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 голос
/ 28 ноября 2010

Нет объекта "self.myCan". Вы должны создать его как объект холста или что-то еще, прежде чем сможете его использовать. Вам также может понадобиться вызвать update_idletasks () в зависимости от того, что вы делаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...