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

时间:2018-02-20 02:42:38

标签: 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 = 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()

此代码只创建一个窗口,带有级联菜单和两个选项:具有关闭窗口的Exit的文件;编辑具有Show Img和Show Text,分别显示图像和文本。

如果我切换两行,即我导入tkinter和ImageTk,Image,就像这样:

from PIL import ImageTk, Image
from tkinter import * 

我收到一个错误说:类型对象'Image'没有属性'open',当我点击Show Img时,其他一切都有效。任何人都可以向我解释为什么会这样吗?或者出了什么问题?

1 个答案:

答案 0 :(得分:0)

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

答案由评论here提供。