所以。。。我正在修改一些基本的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一次只能识别一种方式,而不能识别另一种呢?
最佳答案
from tkinter import *
从
tkinter
模块加载所有内容,并将其放入全局命名空间。import tkinter as tk
从
tkinter
模块加载所有内容,并将其全部放入tk
命名空间。所以现在Label
是tk.Label
,而W
是tk.W
您的第三个选项是,当您只需要模块中的几个对象时,它会更好:
from tkinter import Label, Entry, Button, W, E, Tk
再说一遍,你只需要一两个就好了。不适合你的情况。只是为了完整起见。
幸运的是,您只有一个
import *
模块,否则您将很难确定所有内容来自哪个模块!编辑:
tkinter.W = 'w'
tkinter.E = 'e'
tkinter.S = 's'
tkinter.N = 'n'
它们只是常数。您可以传递字符串值,它也可以正常工作。