[英]Create new ttk widget from tkinter
實際上,我想創建ttk.Spinbox
從tkinter.Spinbox
。 我可以操作下面的代碼,如ttk.Scrollbar
模式。 tkinter.Spinbox
按鈕為我的GUI提供了舊的外觀,這就是我想要ttk.Spinbox
。
編輯:我在Windows 7操作系統上使用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
這是運行時上面的代碼:
似乎問題代碼位於ttk
子目錄中的vistaTheme.tcl
文件中,嵌套代碼以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
}
}
}
具體來說,如果從最里面的塊中的Spinbox.textarea -expand 1 -sticky {}
中刪除-sticky {}
位,那么看起來縮進就會消失:
我建議在這里閱讀Tcl / Tk bug wiki,然后在這里打開一個bug 來解決這個問題。 但是,不會屏住呼吸。 Tcl / Tk版本不會經常發生,因為它是一種非常成熟和穩定的語言。 如果為Tcl / Tk生成了一個修復程序,那么你需要向Python維護者提交一個錯誤,讓他們為Windows版本更新他們的Tcl / Tk內部副本或者后退修復程序。
有可能通過使用ttk的樣式並配置Spinbox.textarea
位以取消設置sticky屬性來解決Python中的問題,但是,我目前沒有確切的代碼片段來執行此操作。
在Windows 7上使用python 3.4我沒有得到相同的縮進。 這是一個演示:
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()
opts = { 'from': 0, 'to': 10, 'increment': 1 }
sp1 = tk.Spinbox(root, **opts)
sp1.place(x=5, y=5)
sp2 = Spinbox(root, **opts)
sp2.place(x=5, y=30)
root.mainloop()
這產生以下結果:
如果您在輸入字段區域中獲得額外的縮進,則可能是使用空格或制表符格式化值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.