suj*_*jit 3 python tkinter ttk python-3.x
考虑这个简单的代码:
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()
Run Code Online (Sandbox Code Playgroud)
当我运行此代码时,它显示错误
ttk.Label(root, text='Heading Here').grid(row=1, column=1)
NameError: name 'ttk' is not defined
Run Code Online (Sandbox Code Playgroud)
当您这样做时import X,您正在导入一个名为X. 从这一点开始,X将被定义。
当你这样做from X import *,你不进口X,你只导入那些东西里面的X。X本身将是未定义的。
因此,当你这样做from tkinter.ttk import *,你不进口ttk,你只导入东西在TTK。这将进口的东西,如Label,Button等,但不是 ttk自己。
ttk在python3中导入的正确方法是使用以下语句:
from tkinter import ttk
Run Code Online (Sandbox Code Playgroud)
这样,您可以使用 引用 ttk 标签ttk.Label,将 ttk 按钮引用为ttk.Button等。
注意:这样做from tkinter.ttk import *是危险的。遗憾的是,ttk并tkinter兼顾出口类具有相同的名称。如果您同时使用from tkinter import *and from tkinter.ttk import *,您将用另一个类覆盖一个类。导入的顺序将改变您的代码的行为方式。
出于这个原因——特别是在 tkinter 和 ttk 的情况下,每个类都有几个重叠的类——应该避免通配符导入。PEP8,官方 python 风格指南,正式不鼓励通配符导入:
应避免通配符导入( from import * ),因为它们使命名空间中存在哪些名称变得不清楚,使读者和许多自动化工具都感到困惑。
注意:您的问题暗示您使用的是 python 3,但如果您使用的是 python 2,您可以只做import ttk而不是from tkinter import ttk. ttk在python 3中移动。