如何将鼠标位置传递给 Tkinter 中的进度条小部件?

How to pass mouse position to progress bar widget in Tkinter?

我无法将鼠标位置传递给在 Tkinter 中创建的进度条小部件滑块。我有用户可以操纵进度条的代码,但是通过使用下面放置的另一个小部件。我想消除第二个小部件。我无法将鼠标的位置传递给 ttk.Progressbar。

当前滑块:

问题是摆脱下面的小部件并能够单独通过鼠标操作绿色条。

当前代码:

from tkinter import *
from tkinter import ttk

root = Tk()
label = Label(root, text ='Progress Bar', font = "50")
label.pack(pady=5)

#mouse position
def motion(event):
    x, y = event.x, event.y
    print('{}, {}'.format(x, y)) 

#Progress Bar
progbar = ttk.Progressbar(root, orient=HORIZONTAL, length=220, mode="determinate", max=50.0)
progbar.pack(pady=20)
progbar.start()
progbar.stop()
progbar.bind('<B1-Motion>', motion)
var = IntVar()
progbar.config(variable=var) 

#Scale
scale = ttk.Scale(root, orient=HORIZONTAL, length=220, variable=var, from_ = 0.0, to= 50.0)
scale.pack()

root.geometry("300x150")
root.mainloop()

您可以使用鼠标位置来获取 x 坐标相对于小部件宽度的百分比。然后您可以将该百分比乘以最大值以获得适当的值。

它可能看起来像这样:

def motion(event):
    width = progbar.winfo_width()
    max_value = int(progbar.cget("max"))
    percent = min(max(event.x/width, 0), max_value)
    value = int(percent * max_value)
    var.set(value)

可以得到传给motion函数的eventx属性除以进度条宽度得到鼠标相对于进度条。然后,您可以使用该值将进度条更新为该比例。为了方便计算,我把进度条的max属性改为1.

from tkinter import *
from tkinter import ttk

root = Tk()
label = Label(root, text ='Progress Bar', font="50")
label.pack(pady=5)

var = IntVar()

def motion(event):
    proportion = event.x / event.widget.winfo_width()
    var.set(proportion)

#Progress Bar
progbar = ttk.Progressbar(root, orient=HORIZONTAL, length=220, mode="determinate", max=1)
progbar.pack(pady=20)
progbar.start()
progbar.stop()
progbar.bind('<B1-Motion>', motion)
progbar.config(variable=var)

root.geometry("300x100")
root.mainloop()