【问题标题】:why does tkinter ttk showing "name ttk is not defined" in python 3.5.1为什么 tkinter ttk 在 python 3.5.1 中显示“名称 ttk 未定义”
【发布时间】:2016-04-13 08:41:01
【问题描述】:

考虑这个简单的代码:

from tkinter import *
from tkinter.ttk import *
root= Tk()
ttk.Label(root, text='Heading Here').grid(row=1, column=1)
ttk.Separator(root,orient=HORIZONTAL).grid(row=2, columnspan=5)
root.mainloop()

当我运行这段代码时,它显示错误

ttk.Label(root, text='Heading Here').grid(row=1, column=1)
NameError: name 'ttk' is not defined

【问题讨论】:

    标签: python python-3.x tkinter ttk


    【解决方案1】:

    当您执行import X 时,您正在导入一个名为X 的模块。从此时起,X 将被定义。

    当您执行from X import * 时,您导入X,您只是导入X内部的内容。 X 本身将是未定义的。

    因此,当您执行from tkinter.ttk import * 时,您不是在导入ttk,您只是在导入in ttk 中的东西。这将导入 LabelButton 等内容,但不会 ttk 本身。

    在python3中导入ttk的正确方法是使用以下语句:

    from tkinter import ttk  
    

    这样,您可以使用ttk.Label 引用ttk 标签,将ttk 按钮引用为ttk.Button 等。

    注意from tkinter.ttk import * 是危险的。不幸的是,ttktkinter 都导出了同名的类。如果你同时使用from tkinter import *from tkinter.ttk import *,你将用另一个类覆盖一个类。导入的顺序将改变您的代码的行为方式。

    出于这个原因——尤其是在 tkinter 和 ttk 都有几个重叠的类的情况下——应该避免通配符导入。 PEP8,官方 python 风格指南,官方不鼓励通配符导入:

    应避免通配符导入( from import * ),因为它们使命名空间中存在哪些名称变得不清楚,从而使读者和许多自动化工具感到困惑。


    注意:您的问题暗示您使用的是 python 3,但如果您使用的是 python 2,则可以使用 import ttk 而不是 from tkinter import ttkttk 在 python 3 中移动。

    【讨论】:

    • 我同意你的回答,但是当使用来自 tkinter import ttk 的行时,我得到了同样的错误 ' Separator(self,orient=HORIZONTAL).grid(row=0, columnspan=5,sticky=" ew") NameError: name 'Separator' is not defined ',你能建议我克服这个错误吗@BryanOakley
    • @sujit:使用ttk.Separator
    • 我试过了,我得到了错误'name ttk is not defined'@Bryan
    • @sujit:如果你做from tkinter import ttk,就不可能得到name ttk is not defined
    • 但我收到的错误是'from tkinter import ttk'行而不是'ttk.Separator'
    【解决方案2】:

    要导入ttk,请替换以下行:

    from tkinter.ttk import *
    

    与:

    from tkinter import ttk
    

    否则,tkinter.ttk 模块的属性将被加载到当前模块命名空间中,而不是 ttk 本身。

    【讨论】:

      【解决方案3】:

      当您导入 ttk 模块时,您可以通过 2 种方式进行 -

      1. from tkinter import ttk 当你这样做时,ttk 几乎像一个变量一样被导入,所以你可以使用那个ttk.Label

      2. from tkinter import * 这称为通配符导入。你不能用ttk.Label你必须直接写Label(options)

      【讨论】:

        【解决方案4】:
        ttk.Label(root, text='HeadingHere').grid(row=1, column=1) 
        NameError: name 'ttk' is not defined
        In this remove ttk as follows.    
        Label(root, text='HeadingHere').grid(row=1, column=1
        

        现在可以正常使用了

        【讨论】:

        • 这实际上并没有回答所提出的问题,它只是提供了一种解决方法。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-09
        • 1970-01-01
        • 2023-03-23
        • 2013-04-30
        • 2021-03-17
        • 2012-10-17
        相关资源
        最近更新 更多