Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从tkinter创建新的ttk小部件_Python_Tkinter_Widget_Ttk - Fatal编程技术网

Python 从tkinter创建新的ttk小部件

Python 从tkinter创建新的ttk小部件,python,tkinter,widget,ttk,Python,Tkinter,Widget,Ttk,实际上,我正试图从tkinter.Spinbox创建ttk.Spinbox。我可以操作下面的代码,比如ttk.Scrollbarpatterntkinter.Spinbox按钮为我的GUI提供了一个旧的外观,这就是我想要ttk.Spinbox的原因 class Spinbox(Widget, tkinter.Spinbox): """spinbox widget.""" def __init__(self, master=None, **kw): Widget._

实际上,我正试图从
tkinter.Spinbox
创建
ttk.Spinbox
。我可以操作下面的代码,比如
ttk.Scrollbar
pattern
tkinter.Spinbox
按钮为我的GUI提供了一个旧的外观,这就是我想要
ttk.Spinbox
的原因

class Spinbox(Widget, tkinter.Spinbox):
    """spinbox widget."""
    def __init__(self, master=None, **kw):
        Widget.__init__(self, master, "ttk::spinbox", kw)
编辑: 我在Windows7操作系统上使用的是
Python3.4
。我需要一个主题Spinbox小部件<代码>ttk.\uuuu初始化\uuuu文件没有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.\uuuu init\uuuu.py
文件中的代码。它继承自
tkinter.Spinbox

class Spinbox(Widget, tkinter.Spinbox):
    """spinbox widget."""
    def __init__(self, master=None, **kw):
        Widget.__init__(self, master, "ttk::spinbox", kw)
下面给出的测试结果令人满意。但是
Spinbox小部件的内容前有一个缩进

tkinter.Spinbox小部件

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
造成的,但我需要配置以获得更好的外观。

在Windows7上使用Python3.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本身的一个错误,而您的Python代码只是将其公开。我将您的示例代码转换为纯Tcl/Tk,并针对Tk-8.5.17和Tk-8.6.3(via)运行它,同样的问题也发生在那里:

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维护人员提交一个bug,让他们为Windows版本更新Tcl/Tk的内部副本,或者将一个修复程序备份


通过使用ttk的样式并配置
Spinbox.textarea
位来取消粘性属性,可以在Python中解决这个问题,但是,目前我没有一个确切的代码片段来完成这项工作。

您的问题是“您对模式化代码有何看法”?这个问题没有多大意义,而且可能会被关闭,因为它是在征求意见。另外,我真的不明白“从tkinter.Spinbox创建ttk.Spinbox”是什么意思。不能从另一个创建一个。首先,它们都已经存在,所以没有理由创建ttk.Spinbox。你是在问如何对ttk.Spinbox子类化吗?你是认真对待ttk has
Spinbox
模块的吗?在将模式代码嵌入到
ttk.\uuuu init\uuuuuu
文件之前,我尝试运行代码,并得到如下错误消息:
AttributeError:'module'对象没有属性“Spinbox”
。我问了两个问题。首先,为什么会出现缩进?第二,操纵原始的
ttk.\uuu init\uuuu
是真的吗?没问题。您可以告诉我如何将tcl/ttk包发送到tkinter。它与python 3.4兼容吗?好的,现在我知道你在做什么了,尽管我仍然不明白你在问什么。您已经有了带有Spinbox的tcl/ttk版本,并且正在尝试使用它。您是否在问为什么ttk spinbox的填充(缩进)比tkinter spinbox少(多?)?如果您提供了一个完整的工作示例,而没有所有的帮助文本,您的问题会好得多。然后,澄清你的问题。如果您提到平台(我猜是Windows),也会有所帮助。FWIW:python3.7中添加了
tkinter.ttk.Spinbox
类(根据)。您说得对。你的密码就是这样的。但是我还没有在我的机器上找到错误。请尝试使用
from=5
获取起始值,好吗?无论你写什么数字,它总是以“0”开头。根据你的调查,Tk()现在已经修复了。太棒了,谢谢!我想应该有人在Python上打开一个bug,以便将此修复程序后移植到至少Python3.x中。不知道他们会不会把这个当成2.x。