【问题标题】:What difference does it make change the order which you import modules on Python?改变你在 Python 上导入模块的顺序有什么不同?
【发布时间】:2018-07-30 07:59:06
【问题描述】:

所以我试图学习使用 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 * 

我收到一条错误消息:类型对象“图像”没有属性“打开”,当我单击“显示图像”时,其他一切正常。谁能向我解释为什么会这样?或者怎么了?

【问题讨论】:

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

标签: python python-3.x tkinter pillow


【解决方案1】:

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


答案由评论here提供。

【讨论】:

    猜你喜欢
    • 2015-10-29
    • 1970-01-01
    • 1970-01-01
    • 2012-03-07
    • 1970-01-01
    • 2011-04-16
    • 2018-02-17
    • 2018-04-16
    相关资源
    最近更新 更多