【问题标题】:tkinter event x y mouse position wrong value only when mouse movement up?仅当鼠标向上移动时,tkinter 事件 x y 鼠标位置错误值?
【发布时间】:2021-10-03 14:38:09
【问题描述】:

我发现了一些关于类似问题的问题。但和我的问题不一样。

如果我的鼠标向左或向右或向下移动,一切正常。但是,如果我将鼠标快速向上移动,x y 位置有时是错误的!为了以最好的方式描述问题,我为您准备了一个简短的视频。如果我将鼠标移动得很慢,则没有问题。为什么?鼠标左、右、下速度没有问题。

Short video

这是我的python代码:

import tkinter as tk
root = tk.Tk()
root.geometry('2000x600')

# Textausgabe erzeugen
label1 = tk.Label(root, text="Hallo Welt!",
                        fg="red",
                        bg="orange",
                        font=("times", 25, "bold", "italic"))
label1.place(x=1, y=1)

#Grafik einbetten
bild1 = tk.PhotoImage(file="biene.png")
label2 = tk.Label(root, image=bild1)
label2.place(x=1,y=100)


def motion(event):
    global pos_x, pos_y, r_pos_x, r_pos_y
    pos_x = event.x
    pos_y = event.y

    label2.place(x=pos_x-60,y=pos_y-110)
    print('{}, {}'.format(pos_x, pos_y))

【问题讨论】:

  • 对于这样的事情,使用Canvas 会是更好的方法。 Canvas 专为基本的 2D 绘图和游戏而设计,与 place() 不同,后者仅设计用于将小部件放入窗口中。使用Canvas 将使这段代码的问题少得多,并且不会闪烁。
  • 非常感谢。我现在走在正确的路上。它工作正常。现在我必须找到一些东西来从图像中获取 x y 坐标来计算位置,因为我使用 .move from canvas ...
  • 您可以使用canvas.coords(image) 获取image 的坐标列表。 canvas.coords() 适用于 Canvas 中的任何内容。
  • 谢谢@SylvesterKruin - 我使用了你的解决方案。它工作正常。

标签: python tkinter events


【解决方案1】:

(event.x, event.y) 是鼠标在事件发生时的坐标,相对于小部件的左上角。您还可以在小部件 label1 或 label2 中获取坐标。

尝试使用(event.root_x, event.root_y),这是事件发生时鼠标相对于屏幕左上角的坐标。

import tkinter as tk
root = tk.Tk()
root.geometry('1000x600')

# Textausgabe erzeugen
label1 = tk.Label(root, text="Hallo Welt!",
                        fg="red",
                        bg="orange",
                        font=("times", 25, "bold", "italic"))
label1.place(x=1, y=1)

#Grafik einbetten
bild1 = tk.PhotoImage(file="biene.png")
label2 = tk.Label(root, image=bild1)
label2.place(x=1, y=100)


def motion(event):
    global pos_x, pos_y, r_pos_x, r_pos_y

    pos_x = event.x_root    # Revised
    pos_y = event.y_root    # Revised

    label2.place(x=pos_x-60, y=pos_y-110)
    print(event.widget)     # Check which widget
    print('{}, {}'.format(pos_x, pos_y))

root.bind("<Motion>", motion)

root.mainloop()

【讨论】:

    【解决方案2】:

    这是我的解决方案。谢谢大家。

    from tkinter import *
    
    canvas_width = 2000
    canvas_height =600
    
    master = Tk()
    master.geometry('2000x600')
    
    
    image1 = "biene.png"
    photo1 = PhotoImage(file=image1)
    width1 = photo1.width()
    height1 = photo1.height()
    canvas1 = Canvas(width=width1, height=height1)
    canvas1.pack(expand=1, fill=BOTH) # <--- Make your canvas expandable.
    x = (width1)/2.0
    y = (height1)/2.0
    item = canvas1.create_image(x, y, image=photo1)
    
    
    
    def motion(event):
        global pos_x, pos_y
        global item
        global item_x, item_y
    
        item_pos = canvas1.coords(item)
        item_x = item_pos[0]
        item_y = item_pos[1]
        #print("item pos = " + str(item_x) + " " + str(item_y))
    
        pos_x = event.x
        pos_y = event.y
    
        
    
        canvas1.move(item, pos_x - item_x, pos_y - item_y) # <--- Use Canvas.move method.
        #canvas1.delete(item)
        #item = canvas1.create_image(pos_x, pos_y, image=photo1)
    
        print('{}, {}'.format(pos_x, pos_y))
        print("Coordinates of the object are:", canvas1.coords(item))
            
            
    master.bind('<Motion>', motion)
    mainloop()
    

    【讨论】:

    • 请接受您的回答,以便其他用户知道该问题已得到满意的回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-02
    • 1970-01-01
    • 1970-01-01
    • 2020-03-21
    相关资源
    最近更新 更多