2013-05-24 3 views
0

Я пытаюсь икру нить, которая периодически меняет цвет моей овальной холст, но почему-то этот код делает ничего:Изменение Canvas Заполните внутри Application

from Tkinter import * 

class Application(Frame): 
    def laufer(self): 
     self.canvas1.configure(fill='black') 

    def bt_start(self): 
     t = Thread(target=self.laufer) 
     t.start() 

    def createWidgets(self):  
     self.canvas1 = Canvas(self, width=50, height=50) 
     self.canvas1.create_oval(10, 10, 50, 50, outline="black", 
      fill="green", width=1) 
     self.canvas1.grid(row=3, column=0) 
    [bt_start...] 

Какой правильный способ изменить заливку цвет?

+0

Это ваша настоящая проблема, или просто пример _like_ вашей реальной проблемы? Если вы просто хотите периодически обновлять холст, вам не нужны потоки. –

+0

Проблема заключается в том, что цвет заливки не изменяется, как ожидалось. И я должен использовать Thread, потому что это упражнение от нашего учителя. – WhatIsName

+0

Вы хотите изменить цвет заливки овала или цвет фона холста? 'fill' не является допустимым вариантом для виджета Canvas. –

ответ

2

Чтобы ответить на вопрос о том, как изменить цвет элемента, вы должны использовать метод itemconfigure, указав ему идентификатор объекта, который вы хотите настроить, или тег, который представляет собой ноль или более объектов для настройки.

Например:

self.id = self.canvas1.create_oval(..., fill="green") 
... 
self.canvas1.itemconfigure(self.id, fill="black") 

Есть большие проблемы, однако. Вы не можете взаимодействовать с холстом из любого потока, кроме основного потока. Это может работать, но есть хорошая вероятность, что ваше приложение в конечном итоге потерпит крах.

Существует два решения: предпочтительный вариант, не используйте потоки. Они добавляют сложность, и много раз вам просто не нужны. В типе программы, используемой в вопросе, потоки совершенно не нужны.

Если вам действительно нужны потоки для вашей программы, общепринятое решение - создать потокобезопасную очередь, попросите ваши рабочие потоки отправить какие-то данные в очередь, а затем опросить свой основной поток очередь на регулярное расписание, чтобы воздействовать на данные.

+0

Есть ли другой способ связи с основным потоком приложения, кроме очереди? – WhatIsName

+1

Поскольку потоки обмениваются переменными, можно вызвать 'itemconfig' из нового потока, но условия гонки всегда являются проблемой в подобных ситуациях. Я думаю, что для обучения это не очень хорошее задание, которое нужно решить с помощью потоковой передачи. (PS: Извините за предыдущий комментарий, я ошибочно представил до его завершения). –

+0

Мой учитель говорит, что очереди - это способ решить эту проблему на микроконтроллерах. Его пример был написан на C#, там также невозможно взаимодействовать с элементами управления, но он вызывает «report_progress», который вызывает interupt в основном потоке с именем «report_changed», который затем меняет элемент управления. ^^ Есть ли аналогичный способ вызова функции внутри основного потока из моего потока? – WhatIsName

Смежные вопросы