Python — как установить условия для привязки клавиш

недавно я нашел этот фрагмент кода здесь (Как нарисовать линию по координатам мыши с помощью tkinter?):

import tkinter as tk

def draw(event):
    x, y = event.x, event.y
    if canvas.old_coords:
        x1, y1 = canvas.old_coords
        canvas.create_line(x, y, x1, y1)
    canvas.old_coords = x, y

def draw_line(event):

    if str(event.type) == 'ButtonPress':
        canvas.old_coords = event.x, event.y

    elif str(event.type) == 'ButtonRelease':
        x, y = event.x, event.y
        x1, y1 = canvas.old_coords
        canvas.create_line(x, y, x1, y1)

def reset_coords(event):
    canvas.old_coords = None

root = tk.Tk()

canvas = tk.Canvas(root, width=400, height=400)
canvas.pack()
canvas.old_coords = None

root.bind('<ButtonPress-1>', draw_line)
root.bind('<ButtonRelease-1>', draw_line)

#root.bind('<B1-Motion>', draw)
#root.bind('<ButtonRelease-1>', reset_coords)

root.mainloop()

и мне действительно любопытно, как заставить эти функции работать соответственно, например. выбранный вариант. Скажем, я хотел бы выбрать, когда рисовать от руки и когда рисовать линии. Я попытался использовать одно целое число для сравнения, а затем определить условия для привязки, например:

if c==1:
    root.bind('<ButtonPress-1>', draw_line)
    root.bind('<ButtonRelease-1>', draw_line)
elif c==2:
    root.bind('<B1-Motion>', draw)
    root.bind('<ButtonRelease-1>', reset_coords)

но, похоже, это не работает. У Вас есть идеи, как создать условия для связывания?


person TheOne    schedule 30.04.2018    source источник
comment
Вы должны выполнить привязку для вызываемой функции. Попробуйте создать обратный вызов новой функции draw_general, чтобы проверить значение c и вызвать соответствующую функцию.   -  person Alon Alexander    schedule 30.04.2018
comment
Боюсь, я не совсем понимаю... :D Не могли бы вы объяснить это, пожалуйста?   -  person TheOne    schedule 30.04.2018
comment
Создайте новую функцию и назовите ее draw_general. Затем вместо выполнения root.bind на draw_line сделайте это на draw_general. Затем в этой функции проверьте значение c. Если это 1 вызов draw_line и если это 2 вызов draw. Проблема в том, что привязка происходит один раз, а не после каждого срабатывания, поэтому вы должны привязываться один раз, а затем обрабатывать свои случаи в обратном вызове (в моем примере draw_general. Надеюсь, это поможет   -  person Alon Alexander    schedule 30.04.2018
comment
К какой клавише/действию я должен привязать функцию draw_general? А где определить ранее использованные бинды - нажать и отпустить?   -  person TheOne    schedule 30.04.2018
comment
Я разобрался, спасибо за помощь   -  person TheOne    schedule 30.04.2018
comment
Пожалуйста, создайте ответ с найденным вами решением, чтобы люди могли позже использовать этот вопрос для решения своих проблем.   -  person Alon Alexander    schedule 01.05.2018


Ответы (1)


Итак, как указано в разделе комментариев, я создал функцию, которая объединила операции двух исходных функций, а затем привязала все используемые символы клавиш к новой функции.

person TheOne    schedule 01.05.2018
comment
Спасибо! Можете ли вы поставить свой рабочий код с ответом? - person Alon Alexander; 02.05.2018