python - 从 tkinter 创建新的 ttk 小部件

标签 python tkinter widget ttk

我实际上是在尝试从 tkinter.Spinbox 创建 ttk.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 Widget

ttk.Spinbox 小部件 ttk.Spinbox Widget

有什么问题吗?为什么会出现缩进?

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 present in Tcl/Tk itself


问题代码似乎在 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
        }
    }
}


具体来说,如果您从最内层的 block 中的 Spinbox.textarea -expand 1 -sticky {} 中删除 -sticky {} 位,那么缩进看起来就像是离开:

Fixed Spinbox example in Tkinter


我建议通读 Tcl/Tk bug wiki here ,然后与他们一起打开一个错误 here对于这个问题。不过,你不会屏住呼吸。 Tcl/Tk 发布并不经常发生,因为它是一种相当成熟和稳定的语言。如果为 Tcl/Tk 生成了修复程序,那么您需要向 Python 维护者提交错误,让他们为 Windows 版本更新 Tcl/Tk 的内部副本或向后移植修复程序。

通过使用 ttk 的样式并配置 Spinbox.textarea 位以取消设置粘性属性,可能可以解决 Python 中的问题,但是,我没有确切的代码片段可以现在就做。

关于python - 从 tkinter 创建新的 ttk 小部件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30783603/

相关文章:

python - Google Roads API - HTTP 错误 403 : Forbidden

python - Tkinter:AttributeError:NoneType 对象没有属性<属性名称>

javascript - 单击按钮后显示 Google 翻译小部件

android - 处理 Widget ListView 中的项目点击 [Android]

python - 接受上传或外部链接作为源的 Django ImageField 小部件

Python 内存表

python - 使用 Tkinter 和 Python 提升图像

php - 不使用 Composer 手动安装 Yii2 扩展

用于二进制数据的 Python 结构

python - X11 Tkinter + PIL + py2app = IOError 无法识别图像文件