Tkinter导入没有*?

时间:2013-08-20 14:38:08

标签: python tkinter

在我过去的编程中,我使用了以下代码:

from tkinter import *
Gui = Tk()

但是有人告诉我导入*因为很多原因不好,但现在我想导入

from tkinter import geometry

它表示几何不是模块(名称)。

当我这样做时:

    import tkinter 
tkinter.geometry(500x500)

它说'模块'对象没有属性'几何'

有人可以解释我如何用tkinter导入所有不同的方法?不仅是几何形状,还有大多数tkinter模块...... ???

5 个答案:

答案 0 :(得分:6)

这是因为模块 tkinter没有geometry功能。它是Tk实例。

这是完成你想要做的事情的好方法:

import tkinter as TK     # TK is a convenient, easy to type alias to use for tkinter.
gui = TK.Tk()
gui.geometry("500x500")   # don't forget the quotes

为什么from tkinter import *是导入tkinter的非理想方式

顺便说一下,无论谁告诉你from tkinter import *是个坏主意都是正确的 - 当你这样做时,你将所有tkinter的命名空间加载到模块的命名空间中。

如果你这样做,你最终可能会遇到令人不快的命名空间冲突,如下所示:

from tkinter import *
gui = Tk()
Label = "hello"
Label1 = Label(gui, text=Label)

# Traceback (most recent call last):
#   File "stackoverflow.py", line 98, in <module>
#     Label1 = Label(gui, text=Label)
# TypeError: 'str' object is not callable

您已覆盖对tkinter的Label小部件的引用 - 因此您无法再创建标签!当然你不应该像这样大写局部变量,但是为什么要担心在你可以这样做时避免那些命名空间问题:

import tkinter as TK

这个^^^^导入方法也是首选,因为如果在某些时候你想要将Tkinter换成另一个具有类似实现的模块,而不是通过代码梳理Tkinter模块的所有元素,你可以去像这样:

#import tkinter as TK
import newTkinter as TK

你们都准备好了。或者,如果您想使用其他模块,其类和方法恰好具有一些相同的名称,以下将导致混乱:

from tkinter import *
from evilOverlappingModule import *

但这没关系:

import tkinter as TK
import evilOverlappingModule as evil

答案 1 :(得分:1)

from module import *被认为有害的原因是它使用模块中的每个公共名称污染主命名空间。充其量这会使代码更不明确,最糟糕的是,它可能导致名称冲突。例如,模块codecs定义了open方法,并且内置版本采用不同的参数。如果我写

from codecs import *
f = open(…)

我会得到open? Tkinter有一个很多的符号,而基于tkinter的程序往往会非常频繁地使用它们。优于import *

import tkinter as tk

然后允许 - 仍然显式,但更容易键入和读取:

tk.Tk().geometry(…)

答案 2 :(得分:0)

如果您*导入了tkinter,那么tkinter.基本上位于命名空间中,这意味着访问tkinter模块而不必担心用tkinter.作为前缀。在这种情况下,geometry("500x500")Tk()的方法,因此您可以像这样使用

from Tkinter import *

Gui = Tk()
Gui.geometry("500x500")
Gui.mainloop()

类似的对象,例如各种小部件等,使用相同的。例如,标签将如下所示:

from Tkinter import *

Gui = Tk()
label= Label(Gui, text="Hello World!")
label.pack()

Gui.mainloop()

答案 3 :(得分:0)

我不知道为什么有人说导入*不是很好的原因,这是不正确的,实际上比仅导入tkinter更好。导入*将使编程更加容易。仅使用tkinter,您需要在做某事之前输入tkinter.,或者如果您将其作为tk进行,则需要做tk.from tkinter import *是您所能做的最好的事情。 / p>

答案 4 :(得分:0)

代替:

from tkinter import *

您可以这样做:

from tkinter import Tk, Canvas #The widgets you want to use

或者仅仅是:

import tkinter as tk