Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Tkinter导入时没有*?_Python_Tkinter - Fatal编程技术网

Python Tkinter导入时没有*?

Python Tkinter导入时没有*?,python,tkinter,Python,Tkinter,在我过去的编程中,我使用了以下代码: from tkinter import * Gui = Tk() 但有人告诉我,出于很多原因,导入*并不好,但现在当我想导入时 from tkinter import geometry 它表示几何体不是模块(名称) 当我这样做的时候: import tkinter tkinter.geometry(500x500) 它表示“模块”对象没有“几何体”属性 有人能告诉我如何用tkinter以各种不同的方式导入吗??不仅是几何图形,而且大多数tki

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

from tkinter import *
Gui = Tk()
但有人告诉我,出于很多原因,导入*并不好,但现在当我想导入时

from tkinter import geometry
它表示几何体不是模块(名称)

当我这样做的时候:

    import tkinter 
tkinter.geometry(500x500)
它表示“模块”对象没有“几何体”属性


有人能告诉我如何用tkinter以各种不同的方式导入吗??不仅是几何图形,而且大多数tkinter模块…?

这是因为模块
tkinter
没有
几何图形
功能。是
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
为什么从tkinter导入的
*
不是导入tkinter的理想方式 顺便说一句,告诉您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
#import tkinter as tk
import newTkinter as tk
from Tkinter import *

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

Gui.mainloop()
这种^^^^^导入方法也是可取的,因为如果您想在某个时候将Tkinter换成另一个具有类似实现的模块,而不是为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
#import tkinter as tk
import newTkinter as tk
from Tkinter import *

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

Gui.mainloop()
你们都准备好了。或者,如果您想使用另一个模块,而该模块的类和方法恰好具有一些相同的名称,则以下操作将导致混乱:

from tkinter import *
from evilOverlappingModule import *
但这很好:

import tkinter as tk
import evilOverlappingModule as evil

如果您
*
导入了tkinter,则实际上
tkinter.
位于命名空间中,这意味着您可以访问tkinter模块,而无需担心在其前面加上
tkinter.
。在本例中,
geometry(“500x500”)
Tk()
的一种方法,因此您可以这样使用它

from Tkinter import *

Gui = Tk()
Gui.geometry("500x500")
Gui.mainloop()
类似的对象,如各种小部件等,都是同样使用的。例如,标签的制作方式如下:

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
#import tkinter as tk
import newTkinter as tk
from Tkinter import *

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

Gui.mainloop()

模块导入*
中的
被认为是有害的,原因是它用模块中的每个公共名称污染了主名称空间。最好的情况下,这会使代码不那么明确,最坏的情况下,它会导致名称冲突。例如,模块
编解码器
定义了一个
打开
方法,并且有内置版本,它采用不同的参数。如果我写

from codecs import *
f = open(…)
我将得到哪个
打开的
?Tkinter有很多符号,基于Tkinter的程序往往大量使用它们。比导入*
更好

import tkinter as tk
然后允许-仍然是显式的,但更易于键入和读取:

tk.Tk().geometry(…)

我不知道为什么有人说导入不好,因为那不是真的,它实际上比导入tkinter要好。导入
*
将使编程更容易。使用tkinter,您需要在做某事之前键入
tkinter.
,或者如果您是作为tk来做的,则需要执行
tk.
,tkinter导入的
是您能做的最好的操作。

而不是:

from tkinter import *
你可以做:

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


无论您使用什么导入,在
tkinter
中都没有
几何体。你真的是指
Gui.geometry
tkinter.Tk.geometry
)?事实上,tkinter import*
中的
被认为是可以的,即使它与PEP8相矛盾,请参阅:我建议使用
。。。作为tk而不是
。。。作为TK
,仅仅是因为TK
看起来更像类名而不是模块名,而且它更显眼。虽然有点晚,但我同意。在tk中替换tk.from tkinter import*和from tkinter import tk将使编程更容易,因为您不必执行tk.Button,只需执行按钮即可