更改在 Python 上导入模块的顺序有什么区别?
What difference does it make change the order which you import modules on Python?
所以我试图学习使用 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()
此代码仅创建一个 window,带有级联菜单和两个选项:具有关闭 window 的退出的文件;具有 Show Img 和 Show Text 的编辑器,分别显示图像和文本。
如果我切换导入 tkinter 和 ImageTk、Image 的两行,如下所示:
from PIL import ImageTk, Image
from tkinter import *
我收到一条错误消息:类型对象 'Image' 没有属性 'open',当我单击 Show Img 时,其他一切正常。谁能向我解释为什么会这样?或者有什么问题?
顺序仅在发生冲突时才重要,最后导入获胜(重新定义),例如tkinter.Image
重新定义了 PIL.Image
,因为它在 之后。您可以通过将 tkinter 导入保留在命名空间中来避免这种情况,例如import tkinter as tk
然后 tk.XXX
用于该模块中的任何调用。通常最好避免 *
所有导入。
答案由评论提供。
所以我试图学习使用 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()
此代码仅创建一个 window,带有级联菜单和两个选项:具有关闭 window 的退出的文件;具有 Show Img 和 Show Text 的编辑器,分别显示图像和文本。
如果我切换导入 tkinter 和 ImageTk、Image 的两行,如下所示:
from PIL import ImageTk, Image
from tkinter import *
我收到一条错误消息:类型对象 'Image' 没有属性 'open',当我单击 Show Img 时,其他一切正常。谁能向我解释为什么会这样?或者有什么问题?
顺序仅在发生冲突时才重要,最后导入获胜(重新定义),例如tkinter.Image
重新定义了 PIL.Image
,因为它在 之后。您可以通过将 tkinter 导入保留在命名空间中来避免这种情况,例如import tkinter as tk
然后 tk.XXX
用于该模块中的任何调用。通常最好避免 *
所有导入。
答案由评论提供