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

时间:2014-03-11 00:08:13

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

命名导入:

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一次性识别它,而不是另一种?

1 个答案:

答案 0 :(得分:5)

from tkinter import *

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


import tkinter as tk

加载tkinter模块,中的所有内容,并将其全部放在tk命名空间中。所以Label现在是tk.Label,{{ 1}}是W


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

tk.W

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


幸运的是,你只有一个from tkinter import Label, Entry, Button, W, E, Tk ,或者你很难确定所有模块的来源!


编辑:

import *

他们只是常数。您可以传递字符串 value ,它也可以正常工作。