tkinter:返回鼠标按钮单击事件的(x,y)结果以用作变量

时间:2018-04-06 02:02:23

标签: python tkinter

我最终试图运行一个比这更复杂的代码,但这是我试图克服的问题。我只需要能够运行一个代码,该代码将点击的像素的x,y坐标记录下来,并将它们记录为变量或将它们附加到列表中。现在我将它们设置为L_Click_xL_Click_y,我最终希望能够将这些坐标添加到列表中,或者能够在函数中调用它们。我所尝试过的任何东西似乎都没有用,我对此很陌生,所以我可能还有一些基本的东西。 (此外出现的红线仅用于视觉确认点击)

from tkinter import *

def motion(event):
    x, y = event.x, event.y
    print("Current Position = ",(x,y))

def LeftClick(event):
    L_Click_x, L_Click_y = event.x, event.y
    redline = canvas.create_line(0,L_Click_y,400,L_Click_y,fill = "red")
    redline = canvas.create_line(L_Click_x,0,L_Click_x,300,fill = "red")
    print("Left Click = ",(L_Click_x,L_Click_y))


root = Tk()

root.bind('<Motion>',motion)
root.bind('<Button-1>',LeftClick)

canvas = Canvas(root, width = "400",height = "300")
canvas.pack()

root.mainloop()

1 个答案:

答案 0 :(得分:0)

您需要跟踪第一个单击的点,直到第二个点已知,然后在两者之间绘制一条线段。
这个简单的例子使用了一个全局变量,绘制时丢弃了这些点;您可能希望使用容器来跟踪线段,以及允许您在不使其全局化的情况下访问它的程序构造。

请注意我将事件绑定到画布而不是root;我更改了导入以避免混淆命名空间(随着应用程序的增长,你会很高兴你这样做),并将camelcase名称更改为更加pythonic的约定。

import tkinter as tk


def motion(event):
    x, y = event.x, event.y
    print("Current Position = ", (x, y))


def left_click(event):
    global line_segment
    line_segment.append(event.x)
    line_segment.append(event.y)
    canvas.create_oval(event.x+1, event.y+1, event.x-1, event.y-1)

    if len(line_segment) == 4:
        canvas.create_line(*line_segment, fill="red")
        line_segment = []


if __name__ == '__main__':

    line_segment = []

    root = tk.Tk()

    canvas = tk.Canvas(root, width="400", height="300")
    canvas.pack()
    canvas.bind('<Motion>', motion)
    canvas.bind('<Button-1>', left_click)

    root.mainloop()

enter image description here