Python 条目小部件:将其存储在变量中

Python 条目小部件:将其存储在变量中,python,tkinter,tkinter-entry,Python,Tkinter,Tkinter Entry,我想将数据从条目存储到变量。 所以我这样做了: main = Tk() main.title("Players Names") var1 = StringVar() var2 = StringVar() Label(main, text="Player One: ").pack(side=LEFT) e1 = Entry(main, textvariable=var1).pack(side=LEFT) Label(main, text="Player Two: ").pack(side=L

我想将数据从条目存储到变量。 所以我这样做了:

main = Tk()

main.title("Players Names")

var1 = StringVar()
var2 = StringVar()

Label(main, text="Player One: ").pack(side=LEFT)
e1 = Entry(main, textvariable=var1).pack(side=LEFT)
Label(main, text="Player Two: ").pack(side=LEFT)
e2 = Entry(main, textvariable=var2).pack(side=LEFT)

def enter():
    player1 = var1.get()
    player2 = var2.get()


def printIt():
    print player1
    print player2

Button(main, width=15, text="ENTER", command=enter).pack(side=LEFT)
Button(main, width=15, text="PRINT", command=printIt).pack(side=LEFT)

main.mainloop()
当我尝试的时候


……它什么也没印。我应该怎么做(除了将printIt函数放入enter函数。我知道这一点;我只想存储数据)?

player1
player2
作为局部变量专门存储在函数中,这意味着它们只能在函数中访问

您应该返回结果:

def enter():
    return [var1.get(), var2.get()]

def printIt():
    print enter()[0], enter()[1]
或者在函数外部声明全局变量,这可能更简单:

main = Tk()

main.title("Players Names")

var1 = StringVar()
var2 = StringVar()
player1 = None               # Global variable declaration
player2 = None

Label(main, text="Player One: ").pack(side=LEFT)
e1 = Entry(main, textvariable=var1).pack(side=LEFT)
Label(main, text="Player Two: ").pack(side=LEFT)
e2 = Entry(main, textvariable=var2).pack(side=LEFT)

def enter():
    global player1, player2
    player1 = var1.get()
    player2 = var2.get()


def printIt():
    global player1, player2
    print player1
    print player2

Button(main, width=15, text="ENTER", command=enter).pack(side=LEFT)
Button(main, width=15, text="PRINT", command=printIt).pack(side=LEFT)

main.mainloop()

player1
player2
enter()
函数的本地函数,因此不能在函数之外访问。虽然您可以使它们成为任何和所有函数都可以引用的全局变量,但出于各种原因,全局变量通常被认为是执行操作的糟糕方式。(请参阅以获取有关为什么避免使用它们可能是一个好主意的详细信息。)

在Tkinter应用程序中避免这种情况的一种方法是使程序更加面向对象,并将主窗口定义为其
Tkinter.Frame
小部件的子类。这相当容易做到,然后您可以根据需要向它添加任意多的附加属性,并通过
self.xxx
从它的任何方法引用它们,而不会用一堆“东西”污染全局名称空间

以下是我的意思(注意我删除了
e1
e2
变量,因为它们都被赋值
None
(因为
pack()
方法返回的就是这个结果)。反正它们没有在其他任何地方使用,这可能就是你从未注意到的原因

from Tkinter import *

class App(Frame):
    def __init__(self, title, master=None):
        Frame.__init__(self, master)  # initialize base class
        self.pack()
        self.master.title(title)

        self.var1 = StringVar()
        self.var2 = StringVar()

        Label(self, text="Player One: ").pack(side=LEFT)
        Entry(self, textvariable=self.var1).pack(side=LEFT)
        Label(self, text="Player Two: ").pack(side=LEFT)
        Entry(self, textvariable=self.var2).pack(side=LEFT)

        Button(self, width=15, text="ENTER", command=self.enter).pack(side=LEFT)
        Button(self, width=15, text="PRINT", command=self.printIt).pack(side=LEFT)

    def enter(self):
        self.player1 = self.var1.get()
        self.player2 = self.var2.get()

    def printIt(self):
        print(self.player1)
        print(self.player2)

app = App("Player's Names")
app.mainloop()

player1和player2是在函数
enter()
中定义的,在
enter()
中它是最需要的,但是在printItOh jesus中把它加倍并没有什么坏处,我多么讨厌全局变量