Tkinter:控制ttk.刻度的增量与tk.刻度还有一个tk.DoubleV公司

2024-03-28 23:00:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我曾经使用tk.Scaledigits属性来确保Label或{}中的数字在滑块移动时显示固定数量的十进制数字。比如3.4564444.567555555.678。。。在

但是,与ttk.Scaledigits和{}一起消失了。如果使用tk.DoubleVar作为比例变量,我将留下一个很长的十进制数。所以根据这篇文章:

How to make ttk.Scale behave more like tk.Scale?

我必须为标签编写自己的数字显示方案,当我已经在使用widget类时,这似乎很疯狂。我还没有看到如何保留DoubleVar,因为我需要更改它的字符串表示形式。在

有没有更简单的方法来实现我想要的?在

更新:

代码如下:

import tkinter as tk
import tkinter.ttk as ttk

root = tk.Tk()
mainframe = tk.Frame(root)

# Model

input = tk.DoubleVar(value=0.)

spin = tk.Spinbox(mainframe, textvariable=input, wrap=True, width=10)
slide = ttk.Scale(mainframe, variable=input, orient='horizontal', length=200)
spin['to'] = 1.0
spin['from'] = 0.0
spin['increment'] = 0.01
slide['to'] = 1.0
slide['from'] = 0.0
# slide['digits'] = 4
# slide['resolution'] = 0.01

# Layout

weights = {'spin': 1, 'slide': 100}

mainframe.grid_rowconfigure(0, weight=1)
mainframe.grid_columnconfigure(0, weight=weights['spin'])
mainframe.grid_columnconfigure(1, weight=weights['slide'])
spin.grid(row=0, column=0, sticky='news')
slide.grid(row=0, column=1, sticky='news')

root.grid_rowconfigure(0, weight=1)
root.grid_columnconfigure(0, weight=1)
mainframe.grid(row=0, column=0)

root.mainloop()

当我拖动刻度时,小数突然失去控制。在

enter image description here


Tags: toinput数字roottkgridttkscale
1条回答
网友
1楼 · 发布于 2024-03-28 23:00:14

这里有一个比我的第一个答案(现在删除了)更好的解决方案,我觉得这是一个更干净和更好的方式来实现功能,以一个更面向对象的方式-因此不需要像我原来的一个黑客。在

相反,它通过定义一个名为“ttk.Scale子类I”Limiter来完成所需的工作,该子类支持名为precision的附加关键字参数。在

import tkinter as tk
import tkinter.ttk as ttk


root = tk.Tk()
mainframe = tk.Frame(root)


# Model

class Limiter(ttk.Scale):
    """ ttk.Scale sublass that limits the precision of values. """

    def __init__(self, *args, **kwargs):
        self.precision = kwargs.pop('precision')  # Remove non-std kwarg.
        self.chain = kwargs.pop('command', lambda *a: None)  # Save if present.
        super(Limiter, self).__init__(*args, command=self._value_changed, **kwargs)

    def _value_changed(self, newvalue):
        newvalue = round(float(newvalue), self.precision)
        self.winfo_toplevel().globalsetvar(self.cget('variable'), (newvalue))
        self.chain(newvalue)  # Call user specified function.


# Sample client callback.
def callback(newvalue):
    print('callback({!r})'.format(newvalue))

input_var = tk.DoubleVar(value=0.)
spin = tk.Spinbox(mainframe, textvariable=input_var, wrap=True, width=10)
slide = Limiter(mainframe, variable=input_var, orient='horizontal', length=200,
                command=callback, precision=4)

spin['to'] = 1.0
spin['from'] = 0.0
spin['increment'] = 0.01
slide['to'] = 1.0
slide['from'] = 0.0
# slide['digits'] = 4
# slide['resolution'] = 0.01

# Layout

weights = {'spin': 1, 'slide': 100}

mainframe.grid_rowconfigure(0, weight=1)
mainframe.grid_columnconfigure(0, weight=weights['spin'])
mainframe.grid_columnconfigure(1, weight=weights['slide'])
spin.grid(row=0, column=0, sticky='news')
slide.grid(row=0, column=1, sticky='news')

root.grid_rowconfigure(0, weight=1)
root.grid_columnconfigure(0, weight=1)
mainframe.grid(row=0, column=0)

root.mainloop()

screenshot of widget

相关问题 更多 >