在Python中,使用Tkinter可以替代全局变量吗
我正在教一门课,有人告诉我要避免使用Python和Tkinter的全局语句。我还不想给我的学生上课 我知道我可以用一个子例程创建我所有的输入框和标签,我的代码也可以工作,但这只是在教一个不同的坏习惯在Python中,使用Tkinter可以替代全局变量吗,python,tkinter,globals,Python,Tkinter,Globals,我正在教一门课,有人告诉我要避免使用Python和Tkinter的全局语句。我还不想给我的学生上课 我知道我可以用一个子例程创建我所有的输入框和标签,我的代码也可以工作,但这只是在教一个不同的坏习惯 from tkinter import * def print_name(): print(entry_location.get()) def main(): global main_window,entry_location main_window =Tk()
from tkinter import *
def print_name():
print(entry_location.get())
def main():
global main_window,entry_location
main_window =Tk()
Button(main_window, text="Print Name",command=print_name) .pack()
entry_location = Entry(main_window)
entry_location.pack()
main_window.mainloop()
main()
这适用于全局语句,但除了从子例程中删除main()中的代码之外,还有其他选择吗?正如phydeaux所说,您可以通过将变量作为参数传递来完成这项工作 完整代码如下所示:
from tkinter import *
def print_name(entry_location):
print(entry_location.get())
def main(main_window, entry_location):
main_window =Tk()
Button(main_window, text="Print Name",command=print_name) .pack()
entry_location = Entry(main_window)
entry_location.pack()
main_window.mainloop()
main(main_window, entry_location)
在您的示例中,您可以通过向按钮注册lambda函数来消除全局变量;此lambda函数收集条目中的te值,并将其作为参数传递给
print\u name
import tkinter as tk
def print_name(text=''): # <- now receives a value as parameter
print(text)
def main():
main_window = tk.Tk()
entry_location = tk.Entry(main_window)
tk.Button(main_window, text="Print Name", command=lambda: print_name(entry_location.get())).pack()
entry_location.pack()
main_window.mainloop()
main()
将tkinter作为tk导入
def print_name(text=''):#您可以将所需的内容传递给函数:def print_name(entry_location)
main_window
,至少不需要是全局变量。print_name
没有明显的理由不能在main
中定义。不教它们星型导入也可能是个好主意。我知道即使是官方文档也会在tkinter中使用它们,但它们不应该这样做。entry\u location
没有被传递给需要它的函数。我尝试过此代码,但它不起作用,我收到错误“NameError:name'main\u window'未定义”。如果我删除主窗口,它只会更改为输入位置。您需要确保在程序开始时定义或只是启动变量,一个简单的(主窗口=”)就可以了。