改变在Python上导入模块的顺序有什么区别?

改变在Python上导入模块的顺序有什么区别?,python,python-3.x,tkinter,pillow,Python,Python 3.x,Tkinter,Pillow,因此,我试图学习使用Tkinter创建GUI的基础知识,我在教程中发现了以下代码: from tkinter import * from PIL import ImageTk, Image class Window(Frame): def __init__(self, master=None): Frame.__init__(self, master) self.master = mast

因此,我试图学习使用Tkinter创建GUI的基础知识,我在教程中发现了以下代码:

from tkinter import *
from PIL import ImageTk, Image

class Window(Frame):

    def __init__(self, master=None):                
        Frame.__init__(self, master)                
        self.master = master                
        self.init_window()    

    def init_window(self):        
        self.master.title("GUI")
        self.pack(fill=BOTH, expand=1)
        menu = Menu(self.master)
        self.master.config(menu=menu)
        file = Menu(menu)
        file.add_command(label="Exit", command=self.client_exit)
        menu.add_cascade(label="File", menu=file)
        edit = Menu(menu)
        edit.add_command(label="Show Img", command=self.showImg)
        edit.add_command(label="Show Text", command=self.showTxt)
        menu.add_cascade(label="Edit", menu=edit)

    def showImg(self):
        load = Image.open("chat-min.png")        
        render = ImageTk.PhotoImage(load)
        img = Label(self, image=render)
        img.image = render
        img.place(x=0, y=0)

    def showTxt(self):
        text = Label(self, text="Maximum effort!")
        text.pack()

    def client_exit(self):
        exit()

root = Tk()
root.geometry("400x300")
app = Window(root)
root.mainloop()
这段代码只是创建了一个窗口,带有一个级联菜单和两个选项:具有关闭窗口的出口的文件;具有“显示Img”和“显示文本”的编辑,分别显示图像和文本

如果我切换输入tkinter和ImageTk,Image的两行,如下所示:

from PIL import ImageTk, Image
from tkinter import * 

我得到一个错误:类型对象“Image”没有“open”属性,当我点击Show Img时,其他的一切都正常。谁能给我解释一下为什么会这样?或者是怎么了?

只有在发生冲突时,订单才起作用,最后一次导入获胜(重新定义),例如,
tkinter.Image
重新定义了
PIL.Image
,因为它在后面。您可以通过将导入保留在名称空间中来避免这种情况,例如,
import tkinter as tk
,然后对该模块中的任何调用导入
tk.XXX
。通常最好避免所有导入



答案由评论提供。

只有在发生冲突时,订单才起作用,最后一次导入获胜(重新定义),例如,
tkinter.Image
重新定义了
PIL.Image
,因为它在后面。您可以通过将
tkinter
导入保留在命名空间中来避免这种情况,例如,
import tkinter as tk
然后为该模块中的任何调用
tk.XXX
。一般来说,最好避免所有导入。*我建议您将此作为答案发布,因为这已经是他“怎么了”问题的完整解释。@AChampion请将此作为答案添加。