ttk.Spinbox类和tk.Spinbox类之间的区别是什么,除了已记录的那些?

我发现了一些差异,例如:


按下箭头后,ttk.Spinbox设置为0,而tk.Spinbox则不设置。
ttk.Spinbox不能通过按箭头来验证更改,而tk.Spinbox可以。
在OSX上按下ttk.Spinbox箭头按钮后不会亮起,而tk.Spinbox箭头按钮会亮起。在Windows上,两者均亮起。
至关重要的是,检索方向仅适用于tk.Spinbox,而不适用于ttk.Spinbox:ttk.Spinbox打印'%d',而tk.Spinbox打印'up''down'(以下工作示例)


后者是一个错误吗?如果是这样,是否有办法解决?我想将ttk.Spinbox用作tk.Spinbox无法正确设置样式,没有.set()等。

以下代码生成两个Spinboxes。第一个继承自tkinter,第二个继承自ttk。它们的修改是相同的。

import tkinter as tk
import tkinter.ttk as ttk


class TkSpinbox(tk.Spinbox):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, increment = 1, **kwargs)

        self.tcl_do_upon_clicking_arrows = self.register(self.do_upon_clicking_arrows)
        self.config(command = (self.tcl_do_upon_clicking_arrows, '%d'))

        self.tcl_validate = self.register(self.validate)
        self.config(validate = 'all', validatecommand = (self.tcl_validate, '%d'))

    def do_upon_clicking_arrows(self, direction):
        print(direction)

    def validate(self, typeOfAction):
        print(typeOfAction)
        return(True)


class TtkSpinbox(ttk.Spinbox):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, increment = 1, **kwargs)

        self.tcl_do_upon_clicking_arrows = self.register(self.do_upon_clicking_arrows)
        self.config(command = (self.tcl_do_upon_clicking_arrows, '%d'))

        self.tcl_validate = self.register(self.validate)
        self.config(validate = 'all', validatecommand = (self.tcl_validate, '%d'))

    def do_upon_clicking_arrows(self, direction):
        print(direction)

    def validate(self, typeOfAction):
        print(typeOfAction)
        return(True)


root = tk.Tk()

tkSpinbox = TkSpinbox()
ttkSpinbox = TtkSpinbox()
tkSpinbox.grid()
ttkSpinbox.grid()

root.mainloop()


在2018年12月,对tkinter 8.6进行了更新,其中除其他外还向ttk添加了Spinbox。据我了解,在tkinter 8.5中,虽然ttk.Spinbox确实遵循ttk的Style等,但没有特殊的ttk.Spinbox。所以必须定义一些内容,对吗?

我在tkinter 8.6和8.5中都尝试过(据说它没有Spinbox,但仍然可以正确设置Style),并且结果相同。即,ttk.Spinbox打印'%d',而tk.Spinbox打印'up''down'。但是,validatecommand确实在两种情况下都能正常工作。

我检查了the Tk source code bug repository的错误报告,但没有发现此问题。我是否正确使用ttk.Spinbox的命令?

最佳答案

使用Tcl / Tk:


按下箭头后,ttk.Spinbox设置为0,而tk.Spinbox
才不是。

必须设置-to值。
ttk.Spinbox不能通过按箭头来验证更改,而tk.Spinbox可以。

实际上是tk.spinbox中的一个错误-它做得太多了。
如果该条目有效,则向上或向下操作不会使其无效。
在tk.Spinbox上按OSX时,ttk.Spinbox箭头按钮不点亮。
箭头按钮。在Windows上,两者均亮起。

OSX小部件的实现与Windows分开,两者都试图
符合原始外观。实施问题。
至关重要的是,检索方向仅适用于tk.Spinbox,而不适用于ttk.Spinbox:ttk.Spinbox打印'%d',而tk.Spinbox打印'up'或'down'(以下工作示例)

这里的问题是,python在tcl_do_upon_clicking_arrows内部做什么?
Tk中没有执行此操作的特定绑定。没有%d绑定参数
在Tk中返回上/下。

这是python tkinter问题。

在Tk中,有关变量或验证命令的跟踪
将用于跟踪更改。

关于python - ttk.Spinbox和tk.Spinbox在行为上有什么区别(并且ttk中的箭头方向 buggy 是?),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54753119/

10-16 12:02