我实际上正在尝试从ttk.Spinbox
创建tkinter.Spinbox
。我可以像ttk.Scrollbar
模式一样操作以下代码。 tkinter.Spinbox
按钮为我的GUI提供了旧外观,这就是为什么我想要ttk.Spinbox
的原因。
编辑:
我在Windows 7 OS上使用Python 3.4
。我需要一个主题化的Spinbox小部件。 ttk.__init__
文件没有Spinbox类/模块。因此,我打开该文件并编写了类似于下面给出的Scrollbar
类的代码。
class Scrollbar(Widget, tkinter.Scrollbar):
"""Ttk Scrollbar controls the viewport of a scrollable widget."""
def __init__(self, master=None, **kw):
"""Construct a Ttk Scrollbar with parent master.
STANDARD OPTIONS
class, cursor, style, takefocus
WIDGET-SPECIFIC OPTIONS
command, orient
"""
Widget.__init__(self, master, "ttk::scrollbar", kw)
以及我放入
ttk.__init__.py
文件中的代码。它继承自tkinter.Spinbox
。class Spinbox(Widget, tkinter.Spinbox):
"""spinbox widget."""
def __init__(self, master=None, **kw):
Widget.__init__(self, master, "ttk::spinbox", kw)
下面给出的测试结果是令人满意的。但是在
Spinbox Widget
的内容之前有一个缩进tkinter.Spinbox小部件
ttk.Spinbox窗口小部件
有什么不对?为什么会出现缩进?
import tkinter as tk
import tkinter.ttk as ttk
class Spinbox(ttk.Widget):
def __init__(self, master, **kw):
ttk.Widget.__init__(self, master, 'ttk::spinbox', kw)
if __name__ == '__main__':
root = tk.Tk()
root.grid_columnconfigure(0, weight=1)
opts = { 'from_': 5, 'to': 10, 'increment': 1 }
sp1 = tk.Spinbox(root, from_=5, to=10)
sp1.grid(row=0, column=0)
sp2 = Spinbox(root, from_=5, to=10)
sp2.grid(row=1, column=0, columnspan=2, sticky="we",pady=2)
root.mainloop()
如果展开根窗口,则
ttk.Spinbox
随其展开,并出现缩进。我想这是由于columnconfigure
造成的,但我需要进行配置以使外观更好。 最佳答案
这似乎是Tk本身的错误,而您的Python代码只是将其公开。我将您的示例代码转换为纯正的Tcl/Tk并将其针对Tk-8.5.17和Tk-8.6.3(通过TclKits)运行,并且同样发生了同样的问题:
package require Tk 8.5
grid columnconfigure . 0 -weight 1
spinbox .spin -from 5 -to 10
grid .spin -row 0 -column 0
ttk::spinbox .spin2 -from 5 -to 10
grid .spin2 -row 1 -column 0 -sticky "ew" -pady 2
这是上面的代码在运行时的样子:
看来问题代码在
vistaTheme.tcl
子目录内的ttk
文件中,在以ttk::style layout TSpinbox
开头的嵌套代码中:ttk::style layout TSpinbox {
Spinbox.field -sticky nswe -children {
Spinbox.background -sticky news -children {
Spinbox.padding -sticky news -children {
Spinbox.innerbg -sticky news -children {
Spinbox.textarea -expand 1 -sticky {}
}
}
Spinbox.uparrow -side top -sticky ens
Spinbox.downarrow -side bottom -sticky ens
}
}
}
具体来说,如果您从最里面的块中的
-sticky {}
中删除了Spinbox.textarea -expand 1 -sticky {}
位,那么缩进看起来就消失了:我建议您通读Tcl/Tk Bug Wiki here,然后针对此问题与here打开一个bug。但是,不会屏住呼吸。 Tcl/Tk发行并不经常发生,因为它是一种相当成熟且稳定的语言。如果生成了针对Tcl/Tk的修复程序,则您需要向Python维护人员提交错误,以使他们为Windows版本更新其内部Tcl/Tk副本或向后移植此修复程序。
通过使用ttk的样式并配置
Spinbox.textarea
位以取消设置sticky属性,可能可以解决Python中的问题,但是,目前我没有确切的代码片段。