Форум программистов, компьютерный форум, киберфорум
Python: Tkinter
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/29: Рейтинг темы: голосов - 29, средняя оценка - 4.62
5 / 0 / 0
Регистрация: 13.03.2020
Сообщений: 101

Обработка нажатия на мышь

04.06.2021, 17:02. Показов 5817. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день, возникла одна проблема, как при первом нажатии ЛКМ координаты записывались в переменные x,y, а при втором нажатии ЛКМ координаты записывались в переменные x1,y1, при этом, на третий раз при нажатии ЛКМ координаты записывались, опять, в переменные x,y, при четвёртом нажатии ЛКМ координаты записывались в переменные x1,y1 снова, и так постоянно.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.06.2021, 17:02
Ответы с готовыми решениями:

PyQt5. Обработка нажатия на элемент
Здравствуйте. Не срабатывает метод connect на чекбоксе. Что я делаю не так ? Спасибо! import sys from PyQt5 import QtWidgets ...

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

Консоль ловит событие MOUSE_MOVED после нажатия на кнопку мыши, в то время как мышь не движется
Разбираюсь с консолью по примерам с microsoft docs. Код я взял отсюда. Консоль ловит события от клавиатуры, изменения размеров буфера...

12
Модератор
Эксперт Python
 Аватар для Fudthhh
2695 / 1601 / 513
Регистрация: 21.02.2017
Сообщений: 4,210
Записей в блоге: 1
07.06.2021, 08:21
redded123, используй флаг: создал переменную, записали в x, y - флаг равен True, записали в x1, y1 - флаг равен False.
1
5 / 0 / 0
Регистрация: 13.03.2020
Сообщений: 101
07.06.2021, 11:24  [ТС]
Сделал проще, ЛКМ ставлю одну точку, а ПКМ ставлю вторую точку, однако, возника одна "маленькая" проблема. Почему-то name 'x1' is not defined, видимо это моя извечная проблема
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
from tkinter import *
root = Tk()
root.geometry('600x600')
 
canvas = Canvas(bg='white')
canvas.pack(fill=BOTH,expand=1)
 
def store_position(event):
    global lastX, lastY
    lastX, lastY = 0, 0
    lastX = event.x
    lastY = event.y
 
def rectangle():
    global x1,y1,x2,y2
    def click(event):
        global x1,y1,x2,y2  
        x1 = event.x     
        y1 = event.y             
        print('x1: ',x1,'y1: ',y1)
    
    def click2(event):
        global x1,y1,x2,y2    
        x2 = event.x     
        y2 = event.y           
        print('x2: ',x2,'y2: ',y2)
            
            
    def functions():        
        global x1,y1,x2,y2 
        canvas.bind('<Button-1>',click)         
        canvas.bind('<Button-3>',click2)                         
    functions()
        
 
    def on_drag2(event):
        canvas.create_rectangle(x1,y1, x2, y2, fill=None, width=2)
        store_position(event)
        
    canvas.bind('<Button-1>', on_drag2)
    canvas.bind('<B1-Motion>', on_drag2)
rectangle()    
root.mainloop()
0
 Аватар для Михалыч
1011 / 355 / 59
Регистрация: 28.02.2013
Сообщений: 937
07.06.2021, 12:13
redded123, зачем вам столько переменных и всюду global (не помню почему, но это вроде как не хорошо)...

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
from tkinter import *
 
 
def b1(event):
    root.title("Левая кнопка мыши")
 
 
def b3(event):
    root.title("Правая кнопка мыши")
 
 
def move(event):
    x = event.x
    y = event.y
    s = "Движение мышью {}x{}".format(x, y)
    root.title(s)
 
 
root = Tk()
root.minsize(width=500, height=400)
 
root.bind('<Button-1>', b1)
root.bind('<Button-3>', b3)
root.bind('<Motion>', move)
 
root.mainloop()
Добавлено через 1 минуту

Не по теме:

Цитата Сообщение от redded123 Посмотреть сообщение
Почему-то name 'x1' is not defined
Я пытался понять почему но запутался в коде...

0
5 / 0 / 0
Регистрация: 13.03.2020
Сообщений: 101
07.06.2021, 15:57  [ТС]
Михалыч, я знаю, что глобальные переменные это не очень хорошо, но я хотел, чтобы хоть как-то работало, а потом я, естественно, убиру все ненужные
0
Модератор
Эксперт Python
 Аватар для Fudthhh
2695 / 1601 / 513
Регистрация: 21.02.2017
Сообщений: 4,210
Записей в блоге: 1
07.06.2021, 16:17
Цитата Сообщение от Михалыч Посмотреть сообщение
Я пытался понять почему но запутался в коде...
Все просто, говорим функции что "x1" это глобальная переменная, а в глобальном пространстве ее нет.

redded123, добавь:
Python
1
2
lastX, lastY = 0, 0
x1, y1, x2, y2 = 0, 0, 0, 0
P.S. не одобряю код в целом.
1
5 / 0 / 0
Регистрация: 13.03.2020
Сообщений: 101
07.06.2021, 16:38  [ТС]
Ничего не работает, даже с флагами

Добавлено через 3 минуты
Fudthhh, дело в том, что питон не может причепить две функции на одну и туже кнопку мыши, поэтому ничего не работает, однако, я сделал рабочий код, но в нём задействованы все три кнопки мышки, а это не удобно как-то
0
 Аватар для Михалыч
1011 / 355 / 59
Регистрация: 28.02.2013
Сообщений: 937
07.06.2021, 16:44
Цитата Сообщение от redded123 Посмотреть сообщение
питон не может причепить две функции на одну и туже кнопку мыши
Ну так-то да, в таком случае я делаю check и отслеживаю его состояние:
Клик мыши ->функция->в функции условие: если check == False то 1, else: что-то другое.
1
5 / 0 / 0
Регистрация: 13.03.2020
Сообщений: 101
07.06.2021, 17:06  [ТС]
А как сделать, чтобы в флаги flag,flag1 были видны в if, если получится, то, так понимаю, проблема решится
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
from tkinter import *
 
root = Tk()
root.geometry('600x600')
 
canvas = Canvas(bg='white')
canvas.pack(fill=BOTH,expand=1)
def rectangle():    
    global x1,x2,y1,y2,flag,flag2
    flag = False       
    flag2 = False 
    def on_drag2(event):
        canvas.create_rectangle(x1,y1, x2, y2, fill=None, width=2)
    def func(event):
        global x1,x2,y1,y2,flag,flag2
        if flag==True:   
            x2 = event.x     
            y2 = event.y 
            flag2 = True
            print('x2: ',x2,'y2: ',y2)
            print(flag2)
            print('------------------------------------------')
        if flag == False:
            x1 = event.x     
            y1 = event.y 
            flag = True
            print('x1: ',x1,'y1: ',y1)
            print(flag)
            print('------------------------------------------')
            
    canvas.bind('<Button-1>',func)         
    def func2():
        global flag,flag2
        if flag == True and flag2 == True:
            on_drag2    
            flag = False
            flag2 = False 
        return flag,flag2  
    func2()       
rectangle()
root.mainloop()
0
 Аватар для Михалыч
1011 / 355 / 59
Регистрация: 28.02.2013
Сообщений: 937
07.06.2021, 17:19
redded123,

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
from tkinter import *
 
 
def b1(event):
    x = event.x
    y = event.y
    #Вот тут делаем ветвление
    if var.get() == 1:
        s = "Клик мышью {}x{}".format(x, y)
    else:
        s = "Клик тоже мышью, но результат другой"
    root.title(s)
 
 
 
 
 
root = Tk()
 
 
var = IntVar()
chk = Checkbutton(text="Выбор есть, его не может не быть", variable=var)
chk.pack(anchor=W, padx=10)
 
root.minsize(width=500, height=400)
 
root.bind('<Button-1>', b1)
root.mainloop()
Добавлено через 2 минуты
Цитата Сообщение от redded123 Посмотреть сообщение
чтобы в флаги flag,flag1 были видны в if
Я не сильно люблю Tk Вряд ли смогу его поправить, постарался кинуть минимальный пример (я так понял что вам нужно примерно это).

Добавлено через 1 минуту
Цитата Сообщение от redded123 Посмотреть сообщение
global x1,x2,y1,y2,flag,flag2
Я упорно не могу понять зачем вам столько переменных?

Добавлено через 53 секунды

Не по теме:

Будет проект строк 1000 кода и вы в них потеряетесь...

У вас же по сути одно действие клик мыши и получение координат клика, ну еще одна переменная на chek итого три.
1
 Аватар для Михалыч
1011 / 355 / 59
Регистрация: 28.02.2013
Сообщений: 937
08.06.2021, 06:29
Цитата Сообщение от Михалыч Посмотреть сообщение
global (не помню почему, но это вроде как не хорошо)
Вспомнил где видел и почему это плохо https://www.cyberforum.ru/blog... g7150.html
1
Модератор
Эксперт Python
 Аватар для Fudthhh
2695 / 1601 / 513
Регистрация: 21.02.2017
Сообщений: 4,210
Записей в блоге: 1
08.06.2021, 07:47
Лучший ответ Сообщение было отмечено redded123 как решение

Решение

Думал сами дойдете, но видимо нет:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import tkinter as tk
 
 
def press_button(event):
    frame.coords(rectangle, event.x, event.y, event.x, event.y)
 
 
def motion_button(event):
    x0, y0, _, _ = frame.coords(rectangle)
    frame.coords(rectangle, x0, y0, event.x, event.y)
 
 
def release_button(event):
    x0, y0, _, _ = frame.coords(rectangle)
    frame.coords(rectangle, x0, y0, event.x, event.y)
 
 
root = tk.Tk()
frame = tk.Canvas(root)
rectangle = frame.create_rectangle(0, 0, 0, 0)
 
 
frame.bind("<ButtonPress-1>", press_button)
frame.bind("<B1-Motion>", motion_button)
frame.bind("<ButtonRelease-1>", release_button)
frame.pack()
root.mainloop()
2
5 / 0 / 0
Регистрация: 13.03.2020
Сообщений: 101
08.06.2021, 11:37  [ТС]
Fudthhh, ОГО! Вот это то что надо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.06.2021, 11:37
Помогаю со студенческими работами здесь

Обработка нажатия
Есть игра (для сенсорных устройств), управление в которой осуществляется нажатием в определенную часть экрана. Есть кнопка...

Обработка нажатия клавиш
Здравствуйте! Помогите с написанием программы на Delphi об обработке нажатых клавиш. Суть в чем: у нас есть Radigroup, с двумя Radio:...

Обработка нажатия на гиперссылку
Доброго времени суток, форумчане, подскажите пожалуйста, как сделать обработчик нажатия на гиперссылку в WPF. На данный момент у меня...

Обработка длительного нажатия
В игре нужно перемещать предмет тогда, когда палец на экране: пальцем касаюсь экрана (не важно, в какой области и сколько времени) и...

Обработка нажатия кнопок.
Здравствуйте! Подскажите где, как подправить чтобы правильно все заработало? Нажимаем на BUT1 загорается на установленное время и гаснет...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru