当 GUI 有 TkInter 时Scale
当他们单击刻度上的某个位置时,默认行为似乎是沿着刻度向鼠标方向滑动滑块(然后意外地经过鼠标)。
我想要的是让滑块在用户单击滑块上的任意位置时始终跳转到并保持连接到用户的鼠标点。如果他们单击刻度上的特定点,滑块应直接跳转到该点。
我下面有一些代码尝试执行此操作,但似乎不起作用,而且我找不到原因。
import tkinter as tk
from tkinter import ttk
def show_values():
print('w1 set to',w1.get())
def snapToVal1(val):
scaleVal = float(w1.get())
if int(scaleVal) != scaleVal:
w1.set(round(float(val)))
def scaleFunc1(event):
g = w1.grid_info()
w1.set(round(8 * (event.y - g['pady'])/(w1.winfo_height() - 2*g['pady'] - 2*g['ipady']))-1)
print('w1 set to',w1.get())
#---
root = tk.Tk()
f1 = ttk.Frame(root, relief = tk.GROOVE)
ttk.Label(f1, text='Stellar\nType').grid(row=0,column=0, columnspan=2,padx=2,pady=2)
for i,text in enumerate(['O','B','A','F','G','K','M','L']):
ttk.Label(f1, text = text).grid(row=i+1,column=0,pady=5,padx=(2,0))
w1 = ttk.Scale(f1, to=7, command=snapToVal1, orient=tk.VERTICAL)
w1.grid(row = 1, column = 1, rowspan = 8, pady=5, padx=2, sticky='nsew')
w1.bind('<Button-1>',scaleFunc1)
f1.grid(row = 0, column = 0,padx=(2,1),pady=2,sticky='nsew')
ttk.Button(root, text='Show', command=show_values).grid(row=1,column=0)
root.mainloop()
这里的相关函数是scaleFunc1
。这个想法是每当用户在秤上按下鼠标按钮时就调用它。然后,它尝试根据事件像素位置和比例大小计算点击在比例上的小数位置,将其转换为比例值,并将其设置为用户单击的值。但是,我发现滑块并不总是跳到同一位置,即使它报告它已设置为我期望的值。这是怎么回事?
我怀疑这与用户按住鼠标按钮的几分之一秒内幻灯片仍在尝试移动有关。