В чем различия между классами ttk.Spinbox и классами tk.Spinbox, кроме документированных?
Я обнаружил несколько различий, например:
- ttk.Spinboxустанавливает значение 0 после нажатия стрелок, в то время как tk.Spinbox этого не делает.
- ttk.Spinbox не проверяет изменения, нажимая стрелки, в то время как tk.Spinbox делает.
- Кнопки со стрелками ttk.Spinboxне загораются при нажатии на OSX, в то время как кнопки со стрелками tk.Spinbox горят.В Windows оба загораются.
- Важно , получение направления работает для 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 года вышло обновление для tkinter 8.6, которое добавляет, помимо прочего, Spinbox к ttk.Насколько я понимаю, в tkinter 8.5 нет специального ttk.Spinbox, хотя ttk.Spinbox действительно следует стилю ttk и т. Д. Поэтому должно быть что-то определенное, верно?
Я пробовал это и в tkinter 8.6, и в8.5 (который предположительно не имеет Spinbox, но все еще правильно устанавливает стиль) и имел тот же результат.А именно, ttk.Spinbox печатает '%d'
, а tk.Spinbox печатает 'up'
или 'down'
.Тем не менее, команда validate работает как и ожидалось в обоих случаях.
Я проверил репозиторий ошибок исходного кода Tk для отчетов об ошибках, но не нашел этой проблемы.Я правильно использую команду ttk.Spinbox?