命名导入与通配符导入为什么/如何影响参数



所以。。。我正在修改一些基本的python/tkinter程序,并将我正在读的书中的python2.x代码翻译成3.x,以确保我理解所有内容。我还试图用"正确"的命名导入而不是通配符导入(即from tkinter import *(编写代码,但效果不太好。。。

目前让我感到困惑的是:原始代码对tkinter进行通配符导入,并且似乎能够"逃脱"不在参数变量(如sticky=W(周围使用引号的惩罚,而如果我进行命名导入,我必须在"W"周围使用引号,否则我会得到错误Unresolved reference 'W'

示例代码(通配符导入(:

from tkinter import *
root = Tk()
Label(root, text="Username").grid(row=0, sticky=W)
Label(root, text="Password").grid(row=1, sticky=W)
Entry(root).grid(row=0, column=1, sticky=E)
Entry(root).grid(row=1, column=1, sticky=E)
Button(root, text="Login").grid(row=2, column=1, sticky=E)
root.mainloop()

命名导入:

import tkinter as tk
root = tk.Tk()
tk.Label(root, text="Username").grid(row=0, sticky='W')
tk.Label(root, text="Password").grid(row=1, sticky='W')
tk.Entry(root).grid(row=0, column=1, sticky='E')
tk.Entry(root).grid(row=1, column=1, sticky='E')
tk.Button(root, text="Login").grid(row=2, column=1, sticky='E')
root.mainloop()

两者都有效,但为什么python一次能以一种方式识别它,而另一次却不能?

from tkinter import *

tkinter模块加载所有内容,并将其放入全局命名空间中。


import tkinter as tk

tkinter模块加载所有内容,并将其全部放入tk命名空间中


当你只需要模块中的几个对象时,你的第三个选项会更好,那就是:

from tkinter import Label, Entry, Button, W, E, Tk

等等。同样,当你只需要一两个的时候会更好。这对你的处境不利。只是为了完整起见才包括在内。


幸运的是,您只有一个import *,否则您将很难确定所有内容来自哪个模块


编辑:

tkinter.W = 'w'
tkinter.E = 'e'
tkinter.S = 's'
tkinter.N = 'n'

它们只是常数。您可以传递字符串,它也同样有效。

最新更新