在 python tkinter 刻度中更改槽增量,而不影响滑块

Change trough increment in python tkinter scale, without affecting slider

当您在 python tkinter 刻度中单击槽(滑块的任一侧)时,滑块将移动一个增量到 left/right。

如果你按住鼠标,它会移动得更快,使用repeatdelay & repeatinterval。

我想要的是当您在槽中单击时让滑块以更大的增量移动,而不会失去使用滑块以更小的步长增加的能力。

我研究了一下scale widget,可以看到它有一个bigincrement字段,就是为了支持这个,但是我不确定什么时候使用bigincrement?

我也看过 resolution,它确实改变了滑块的跳跃量,但它失去了通过拖动滑块进行微调的能力。

那么,每次单击槽时,我如何配置比例以使用 bigincrement 作为值来增加比例。并且仍然能够拖动滑块以获得更细粒度的增量?

示例代码:

from Tkinter import *

master = Tk()

w = Scale(master, from_=0, to=100, bigincrement=10)
w.pack()

w = Scale(master, from_=0, to=200, orient=HORIZONTAL, bigincrement=100)
w.pack()

mainloop()

使用resolution参数。

参见 the docs,尤其是 "bindings" 部分中的第 1 点。

编辑:如果您想在不影响分辨率的情况下更改增量,则必须劫持滑块的工作方式。您可以像这样制作自己的滑块版本:

import Tkinter as tk

class Jarvis(tk.Scale):
    '''a scale where a trough click jumps by a specified increment instead of the resolution'''
    def __init__(self, master=None, **kwargs):
        self.increment = kwargs.pop('increment',1)
        tk.Scale.__init__(self, master, **kwargs)
        self.bind('<Button-1>', self.jump)

    def jump(self, event):
        clicked = self.identify(event.x, event.y)
        if clicked == 'trough1':
            self.set(self.get() - self.increment)
        elif clicked == 'trough2':
            self.set(self.get() + self.increment)
        else:
            return None
        return 'break'

# example useage:
master = tk.Tk()
w = Jarvis(master, from_=0, to=200, increment=10, orient=tk.HORIZONTAL)
w.pack()
w = Jarvis(master, from_=0, to=200, increment=30, orient=tk.HORIZONTAL)
w.pack()
master.mainloop()