gpt4 book ai didi

python - ttk.Spinbox 和 tk.Spinbox 之间的行为差​​异是什么(ttk 中的箭头方向有问题吗?)

转载 作者:行者123 更新时间:2023-12-01 08:19:29 25 4
gpt4 key购买 nike

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

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

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

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

以下代码生成两个 Spinbox。第一个继承自 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.Spinbox 确实遵循 ttk 的 Style 等。所以必须定义一些东西,对吗?

我在 tkinter 8.6 和 8.5 中尝试过这个(据说没有 Spinbox 但仍然正确设置样式)并得到了相同的结果。即,ttk.Spinbox 打印 '%d',而 tk.Spinbox 打印 'up''down'。然而,validatecommand 在这两种情况下都按预期工作。

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

最佳答案

使用 Tcl/Tk:

  • 按下箭头后 ttk.Spinbox 设置为 0,而 tk.Spinbox没有。

    必须设置 -to 值。

  • ttk.Spinbox 不会通过按箭头来验证更改,而 tk.Spinbox 会。

    实际上是 tk.spinbox 中的一个错误——它做得太多了。如果输入有效,则向上或向下操作不会使其无效。

  • 在 OSX 上按下 ttk.Spinbox 箭头按钮时,tk.Spinbox 不会亮起箭头按钮可以。在 Windows 上,两者都会亮起。

    OSX 小部件实现与 Windows 是分开的,并且都试图与原生外观和感觉相匹配。实现问题。

  • 至关重要的是,检索方向适用于 tk.Spinbox,但不适用于 ttk.Spinbox:ttk.Spinbox 打印“%d”,而 tk.Spinbox 打印“向上”或“向下”(下面的工作示例)

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

    这是一个 python tkinter 问题。

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com