Tkinter导入没有*?

Sha*_*bal 5 python tkinter

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

from tkinter import *
Gui = Tk()
Run Code Online (Sandbox Code Playgroud)

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

from tkinter import geometry
Run Code Online (Sandbox Code Playgroud)

它说几何不是模块的东西(名称).

当我这样做时:

    import tkinter 
tkinter.geometry(500x500)
Run Code Online (Sandbox Code Playgroud)

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

有人可以解释我如何用tkinter导入所有不同的方式?不仅几何,而且大多数tkinter模块... ???

Bri*_*ius 7

那是因为模块 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
Run Code Online (Sandbox Code Playgroud)

为什么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
Run Code Online (Sandbox Code Playgroud)

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

import tkinter as TK
Run Code Online (Sandbox Code Playgroud)

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

#import tkinter as TK
import newTkinter as TK
Run Code Online (Sandbox Code Playgroud)

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

from tkinter import *
from evilOverlappingModule import *
Run Code Online (Sandbox Code Playgroud)

但这没关系:

import tkinter as TK
import evilOverlappingModule as evil
Run Code Online (Sandbox Code Playgroud)

  • 我个人建议使用`...作为tk`而不是`...作为TK`,因为`TK`看起来更像是一个类名而不是模块名,而且更加突兀. (9认同)