3

如何在 PySimpleGUI 中单击鼠标提取数据点?

我有一组 2D (x,y) 数据点。我使用 PySimpleGUI 图形元素和 drawCircle 函数绘制了 2D 数据。现在,当我单击一个圆圈(代表一个数据点)时,我想执行一个函数,将这个 (x,y) 数据点作为其输入。当我单击圆上的任意位置时,我想获得我绘制的确切 (x,y) 数据点(不是我单击的位置的坐标)。

import PySimpleGUI as sg

layout = [[sg.Graph(canvas_size=(800, 800), graph_bottom_left=
(-105, -105), graph_top_right=(105, 105), background_color='white',
                    key='graph', tooltip=None, enable_events=True)], ]
window = sg.Window('Network Prediction Evaluation', layout,
                   grab_anywhere=True).Finalize()
graph = window['graph']

# Draw axis
graph.DrawLine((-100, 0), (100, 0))
graph.DrawLine((0, -100), (0, 100))
for x in range(-100, 101, 20):
    graph.DrawLine((x, -3), (x, 3))
    if x != 0:
        graph.DrawText(x, (x, -10), color='green')
for y in range(-100, 101, 20):
    graph.DrawLine((-3, y), (3, y))
    if y != 0:
        graph.DrawText(y, (-10, y), color='blue')

# Draw Graph
f = open("./data/train_analysis.txt", "r")
s_id = []
true_val = []
pred_val = []
f.readline()  # to remove column names
for x in f:
    s = x.split()
    s_id.append(float(s[0]))
    true_val.append(int(round(float(s[1]) * 100)))
    pred_val.append(int(round(float(s[2]) * 100)))

for i in range(len(true_val)):
    # graph.DrawLine((true_val[i],0),(true_val[i],pred_val[i]))
    graph.DrawCircle((true_val[i], pred_val[i]), 4, line_color='red',
                     fill_color='blue')

while True:
    event, values = window.read()
    if event is None:
        break
    val = values[event]
    print(val)


我能够获得鼠标点击位置的坐标。但是当我单击圆圈上的任意位置时,我想获得确切的数据点。我怎样才能做到这一点?

4

0 回答 0