繁体   English   中英

为什么 tkinter ttk 在 python 3.5.1 中显示“名称 ttk 未定义”

[英]why does tkinter ttk showing “name ttk is not defined” in python 3.5.1

考虑这个简单的代码:

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

当您import X ,您正在导入一个名为X的模块。 从这一点开始, X将被定义。

当你from X import * ,你是不是进口X ,您只导入一个是内部的事情X X本身将是未定义的。

因此,当你from tkinter.ttk import * ,你是不是进口ttk ,你只导入东西TTK。 这将导入诸如LabelButton等内容,但不会ttk本身。

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

from tkinter import ttk  

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

注意:执行from tkinter.ttk import *是危险的。 不幸的是, ttktkinter两个出口类具有相同的名称。 如果您同时执行from tkinter.ttk import * from tkinter import *from tkinter.ttk import * ,您将用另一个类覆盖一个类。 导入的顺序将改变您的代码的行为方式。

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

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


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

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

from tkinter.ttk import *

与:

from tkinter import ttk

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

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

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

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

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

现在它工作正常

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM