Рисование по клику с помощью Tkinter

У меня уже есть сетка квадратов 10X10, и я хочу нарисовать еще один квадрат поверх квадрата в сетке, когда он щелкнут.

Прямо сейчас у меня есть функции для рисования сетки в кадре и функции для определения координат квадрата (верхний левый угол и нижний правый угол).

Часть, с которой у меня проблемы, это

    canvas=Canvas()
    for row in range(10):
        for column in range(10):
            canvas.create_rectangle(10+(row*53),10+(column*53),60+(row*53),60+(column*53),fill='blue')
    self.bind('<Button-1>',self.changeBlock)    

куда

def changeBlock(self,event):
    self.canvas.create_rectangle(upperX(event),upperY(event),lowerX(event),lowerY(event),fill='red')

upperX,upperY,lowerX,lowerY — все функции для определения координат квадрата, в котором находится мышь.

Я не знаю, почему changeBlock не запускается, когда я нажимаю что-то на холсте.

Полный:

class MainFrame(Frame):
def __init__(self,parent):
    Frame.__init__(self,parent,background="blue")
    self.parent=parent
    self.parent.title("simple")
    self.parent.geometry("600x600")
    self.parent.resizable(0,0)
    self.pack(fill=BOTH,expand=1)
    canvas=Canvas()
    for row in range(10):
        for column in range(10):
            canvas.create_rectangle(10+(row*53),10+(column*53),60+(row*53),60+(column*53),fill='blue')
    self.bind('<Button-1>',self.changeClickBlock)
    canvas.pack(fill=BOTH, expand=1)

person Eric Chan    schedule 08.12.2014    source источник


Ответы (1)


Этот код работает, небольшая ваша модификация. Вы не предоставили достаточно информации, но ее было достаточно, чтобы убедиться, что все... должно работать. Я использую python3 - в python2 вы бы импортировали из «Tkinter».

Важные вопросы:

  • что такое "я" - какой класс вы определили? Если self не выводит какой-то виджет tkinter, то привязка к нему не принесет много пользы. Выдает ли bind исключение?

    Вы также не сохранили ссылку на свой холст, так как вы позже узнаете, что такое self.canvas? Довольно запутанно, но я предполагаю, что вы просто не опубликовали весь код.

Вероятные проблемы:

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

    Мое второе предположение заключается в том, что вы забыли упаковать/сетку/поместить холст на верхний уровень tkinter. Просто сделать его недостаточно, его нужно еще как-то добавить в сцену

    from tkinter import *
    
    root = Tk()
    canvas=Canvas() # where did you save this? It's very important to keep it!
    
    def changeBlock( event=None ): 
            # Here, I'm just making a rectangle of size 10. Make it as big as you want
            # notice though that you're "self.canvas" will need to reference the
            # the right thing
            canvas.create_rectangle(event.x,event.y,event.x+10,event.y+10,fill='red')
    
    for row in range(10):
        for column in range(10):
            canvas.create_rectangle(10+(row*53),10+(column*53),60+(row*53),60+(column*53),fill='blue')
    
    # Here, I'm binding to the Canvas. Bind to the widget where the event occurs
    canvas.bind('<Button-1>',changeBlock)  
    
    # make sure you add the widget somehow, or else it won't appear
    canvas.grid()  
    
    root.mainloop()
    

Другие предложения

У Effobt есть отличный туториал по tkinter. Это отличное место для поиска основных примеров

На элементах холста: http://effbot.org/tkinterbook/canvas.htm.

О событиях: http://effbot.org/tkinterbook/tkinter-events-and-bindings.htm

person en_Knight    schedule 08.12.2014
comment
Это, кажется, не проблема, которая у меня есть. Когда я запускаю свой код и нажимаю на любой из квадратов, он вообще не вызывает changeBlock. Я помещаю операторы печати в changeBlock, и они не запускаются, когда я нажимаю. - person Eric Chan; 08.12.2014
comment
Запустите код, который я только что дал, он работает. Почему ты привязываешься к себе? Вы должны привязать к холсту. Холст не может быть на себе, если только я не расширяет Tk, что крайне неортодоксально. Имеет ли это смысл? - person en_Knight; 08.12.2014
comment
Хорошо. Проблема заключалась в том, что я привязал кнопку к себе, а не к холсту. теперь это работает. Спасибо! - person Eric Chan; 08.12.2014