Python/tkinter/canvas: события «мышь вниз + перетаскивание + мышь вверх» возвращают только тег элемента «мышь вниз»?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Python/tkinter/canvas: события «мышь вниз + перетаскивание + мышь вверх» возвращают только тег элемента «мышь вниз»?

Сообщение Anonymous »

В Python/tkinter/canvas: пользователь щелкнет один элемент, перетащит его на другой элемент и отпустит. Сами элементы не перетаскиваются/перемещаются; Мне нужны только теги обоих элементов. Проблема, которую я наблюдаю, заключается в том, что когда указатель мыши находится на одном элементе, а затем перетаскивается на другой элемент для отпускания мыши, холст возвращает идентификатор #/тег первого элемента как идентификатор события #/тег.

Координаты мыши сообщаются правильно для обоих событий, а теги работают правильно во всех остальных отношениях.

Это ошибка или ограничение реализации? Есть ли обходные пути? Или я делаю это неправильно?

Демонстрационный код ниже также доступен по адресу https://pastebin.com/MD9AuAUS

import tkinter as tk
from tkinter import ttk
from tkinter import messagebox
from functools import partial

'''
Ctag Tester v1.0
29 February 2020
Written for Python 3.7.0 (v3.7.0:1bf9cc5093, Jun 27 2018, 04:06:47)
[MSC v.1914 32 bit (Intel)] on win32 / Windows 10 / VS Code (ide)

This is a demo of a tkinter / canvas bug. Or something. (?)

1. Each of the two squares on the canvas should report its tag
for a mouse-1-down and mouse-1-up event.

2. It always reports properly if you click and release on the same item.

3. PROBLEM: If you click down on one square and then drag to the other
square, the mouse-up event gives the same tag as the mouse-down event,
even though they did not occur on the same item.

4. The mouse x-y coordinates are also reported, and those always
report correctly wherever those two events occur.

5. What I assumed should happen is that the mouse-down event should get
the tag of the item that it occurs on, and the mouse-up event should get
the tag of the item that it occurs on.
'''

def main():
program = TestProgram1()
program.window.mainloop()

class TestProgram1:

def __init__(self):
self.window = tk.Tk()
self.window.title( "Ctag Tester v1.0" )
self.window_width = 800
self.window_height = 600
self.window.minsize(self.window_width, self.window_height)
self.window_position_x = 40
self.window_position_y = 40
self.window.geometry('%dx%d+%d+%d' % (self.window_width, self.window_height, self.window_position_x, self.window_position_y))
self.window.resizable(False, False)

x_pos = 20
y_pos = 20
self.staticlabel_38 = tk.Label(master=self.window, text="mousedown xy:")
self.staticlabel_38.place(x=x_pos, y=y_pos)
x_pos = 180
y_pos = 20
self.staticlabel_42 = tk.Label(master=self.window, text="mouseup xy:")
self.staticlabel_42.place(x=x_pos, y=y_pos)

x_pos = 20
y_pos = 50
self.label_mousedown = tk.Label(master=self.window, text="[none]")
self.label_mousedown.place(x=x_pos, y=y_pos)
x_pos = 180
y_pos = 50
self.label_mouseup = tk.Label(master=self.window, text="[none]")
self.label_mouseup.place(x=x_pos, y=y_pos)

x_pos = 20
y_pos = 100
self.staticlabel_55 = tk.Label(master=self.window, text="mousedown tag:")
self.staticlabel_55.place(x=x_pos, y=y_pos)
x_pos = 180
y_pos = 100
self.staticlabel_59 = tk.Label(master=self.window, text="mouseup tag:")
self.staticlabel_59.place(x=x_pos, y=y_pos)

x_pos = 20
y_pos = 130
self.label_tagdown = tk.Label(master=self.window, text="[none]")
self.label_tagdown.place(x=x_pos, y=y_pos)
x_pos = 180
y_pos = 130
self.label_tagup = tk.Label(master=self.window, text="[none]")
self.label_tagup.place(x=x_pos, y=y_pos)

x_pos = 350
y_pos = 40
self.canvas1 = tk.Canvas(master=self.window, width=400, height=400)
self.canvas1.place(x=x_pos, y=y_pos)
self.canvas1.create_rectangle(2, 2, 400, 400, outline='black', fill='white')

target_1 = self.canvas1.create_rectangle(80, 80, 180, 180, outline='black', fill='green', tags=('greenbox'))
self.canvas1.tag_bind('greenbox', '', partial(self.chart_item_mousedown_event, target_1))
self.canvas1.tag_bind('greenbox', '', partial(self.chart_item_mouseup_event, target_1))

target_2 = self.canvas1.create_rectangle(240, 180, 340, 280, outline='black', fill='red', tags=('redbox'))
self.canvas1.tag_bind('redbox', '', partial(self.chart_item_mousedown_event, target_2))
self.canvas1.tag_bind('redbox', '', partial(self.chart_item_mouseup_event, target_2))

def chart_item_mousedown_event(self, c_handle, event):
temp_tag = self.canvas1.gettags(c_handle)
if temp_tag == "":
self.label_tagdown.config(text='[none]')
else:
self.label_tagdown.config(text=temp_tag)
m_event = "x:" + str(event.x) + ", y:" + str(event.y)
self.label_mousedown.config(text=m_event)

def chart_item_mouseup_event(self, c_handle, event):
temp_tag = self.canvas1.gettags(c_handle)
if temp_tag == "":
self.label_tagup.config(text='[none]')
else:
self.label_tagup.config(text=temp_tag)
m_event = "x:" + str(event.x) + ", y:" + str(event.y)
self.label_mouseup.config(text=m_event)

if __name__ == "__main__":
main()


Подробнее здесь: https://stackoverflow.com/questions/604 ... -the-mouse
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Найдите максимальную длину последовательности чисел вверх, вниз и вверх.
    Anonymous » » в форуме JAVA
    0 Ответы
    54 Просмотры
    Последнее сообщение Anonymous
  • Найдите максимальную длину последовательности чисел вверх, вниз и вверх.
    Anonymous » » в форуме JAVA
    0 Ответы
    63 Просмотры
    Последнее сообщение Anonymous
  • Найдите максимальную длину последовательности чисел вверх, вниз и вверх.
    Anonymous » » в форуме JAVA
    0 Ответы
    52 Просмотры
    Последнее сообщение Anonymous
  • Найдите максимальную длину последовательности чисел вверх, вниз и вверх.
    Anonymous » » в форуме JAVA
    0 Ответы
    47 Просмотры
    Последнее сообщение Anonymous
  • Найдите максимальную длину последовательности чисел вверх, вниз и вверх.
    Anonymous » » в форуме JAVA
    0 Ответы
    35 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Python»