在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()

我正在教一门课,有人告诉我要避免使用Python和Tkinter的全局语句。我还不想给我的学生上课

我知道我可以用一个子例程创建我所有的输入框和标签,我的代码也可以工作,但这只是在教一个不同的坏习惯

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'未定义”。如果我删除主窗口,它只会更改为输入位置。您需要确保在程序开始时定义或只是启动变量,一个简单的(主窗口=”)就可以了。