命名与通配符导入的原因/方式如何影响参数?

mem*_*nuk 2 python import tkinter wildcard

所以...我正在修改一些基本的python/tkinter程序,并将我正在阅读的书中的python 2.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()
Run Code Online (Sandbox Code Playgroud)

命名导入:

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()
Run Code Online (Sandbox Code Playgroud)

两者都有效,但为什么python一次性识别它,而不是另一种?

mhl*_*ter 5

from tkinter import *
Run Code Online (Sandbox Code Playgroud)

tkinter模块加载所有内容,并将其放在全局名称空间中.


import tkinter as tk
Run Code Online (Sandbox Code Playgroud)

tkinter模块加载所有内容,并将其全部放在tk命名空间中.所以,Label现在是tk.Label,而且Wtk.W


您的第三个选项,当您只需要模块中的一些对象时,它会更好:

from tkinter import Label, Entry, Button, W, E, Tk
Run Code Online (Sandbox Code Playgroud)

等等.再次,当你只需要一两个时更好.对你的情况不利.仅包括完整性.


幸运的是,你只有一个,import *或者你很难确定哪个模块都来自哪个!


编辑:

tkinter.W = 'w'
tkinter.E = 'e'
tkinter.S = 's'
tkinter.N = 'n'
Run Code Online (Sandbox Code Playgroud)

它们只是常量.您可以传递字符串,它也可以正常工作.

  • 因此仇恨`import*`:) (2认同)