在 Tkinter 滑块中,您能否将范围从线性变为指数,以便在处理大量数字时更容易选择数字?

In a Tkinter slider, can you vary the range from being linear to exponential for easier number selection when dealing with large numbers?

我目前正在 Python 中为二十一点模拟器创建一个库。连接到模拟器的是一个控制输入的 Tkinter GUI。我希望输入范围为 1-50,000,000;但是,我希望用户能够轻松 select 更小的数字范围,例如 15,000-75,000。

我认为最好的方法是使用 f(x)=x^2 而不是正常的线性行为来更新滑块中的值范围。

我相信我可以创建一个新的小部件来显示 f(x)=x^2 函数的值,其中输入是 slider.get()滑块小部件。但我希望有人知道一个更优雅的解决方案,可以使用滑块小部件本身显示和使用这个 f(x)=x^2 值。

这是从此处找到的教程点示例中提取的基本小部件代码:https://www.tutorialspoint.com/python/tk_scale.htm


def sel():
   selection = "Value = " + str(var.get())
   label.config(text = selection)

root = Tk()
var = DoubleVar()
scale = Scale( root, variable = var )
scale.pack(anchor=CENTER)

button = Button(root, text="Get Scale Value", command=sel)
button.pack(anchor=CENTER)

label = Label(root)
label.pack()

root.mainloop()```

您可以创建一个版本的“缩放”小部件,它将 return 滑块的值但应用了特定的数学函数。在下面的示例中,我 return x^2.

import tkinter as tk

def sel():
   selection = "Value = " + str(scale2.value)
   label.config(text = selection)

class LogScale(tk.Scale):
    def __init__(self,parent,**kwargs):
        tk.Scale.__init__(self,parent,**kwargs)
        self.var = tk.DoubleVar()
        #self.config[showvalue] = 0
        self['showvalue'] = 0
        self['label'] = 0
        self['command'] = self.update
        self['variable'] = self.var

    def update(self,event):
        self.config(label=self.value)

    @property
    def value(self):
        return str(int(self.var.get()) ** 2)

root = tk.Tk()

scale2 = LogScale(root)
scale2.pack()

button = tk.Button(root, text="Get Scale Value", command=sel)
button.pack(anchor=tk.CENTER)

label = tk.Label(root)
label.pack()

root.mainloop()

我隐藏了与滑块一起移动的普通标签,并使用另一个标签显示“已修改”值。