簡體   English   中英

從tkinter創建新的ttk小部件

[英]Create new ttk widget from tkinter

實際上,我想創建ttk.Spinboxtkinter.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小部件 tkinter.Spinbox小部件

ttk.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 Spinbox bug存在於Tcl / Tk本身


似乎問題代碼位於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 {}位,那么看起來縮進就會消失:

修復了Tkinter中的Spinbox示例


我建議在這里閱讀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()

這產生以下結果:

tk spinbox和ttk spinbox的屏幕截圖

如果您在輸入字段區域中獲得額外的縮進,則可能是使用空格或制表符格式化值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM