Python 使用tkinter中的按钮更改变量

Python 使用tkinter中的按钮更改变量,python,tkinter,Python,Tkinter,问题所在的代码相当大,所以我在这里起草了一个FingerPaint版本 import tkinter variable = "data" def changeVariable(): variable = "different data" def printVariable(): print(variable) window = tkinter.Tk button1 = tkinter.Button(window, command=changeVariable) butto

问题所在的代码相当大,所以我在这里起草了一个FingerPaint版本

import tkinter

variable = "data"

def changeVariable():
    variable = "different data"

def printVariable():
    print(variable)

window = tkinter.Tk
button1 = tkinter.Button(window, command=changeVariable)
button1.pack()
button2 = tkinter.Button(window, command=printVariable)
button2.pack()
所以在这个例子中,我按下第一个按钮来更改“变量”,然后按下第二个按钮来打印它。但打印的是“数据”,而不是“不同的数据”。我搜索了一下,决定在主代码和函数中定义变量之前使用global,因此代码如下所示

import tkinter

global variable
variable = "data"

def changeVariable():
    global variable
    variable = "different data"

def printVariable():
    global variable
    print(variable)

window = tkinter.Tk()
button1 = tkinter.Button(window, command=changeVariable)
button1.pack()
button2 = tkinter.Button(window, command=printVariable)
button2.pack()

window.mainloop()
但现在它说“name”变量“未定义”


本质上,我如何通过tkinter中的按钮使变量“variable”改变?我想使用global是不是错了?

你使用global有点不恰当。您不需要到处定义全局。让我们把它分解一下

您不需要在全局命名空间中定义全局命名空间

from tkinter import *
window = Tk()
myvar = "data" # this variable is already in the global namespace
这告诉函数在与变量
myvar
交互时检查全局名称空间

def changeVariable():
    global myvar
    myvar = "different data"
def printVariable():
    print(myvar)

button1 = Button(window, command = changeVariable)
button1.pack()
button2 = Button(window, command = printVariable)
button2.pack()

window.mainloop()
这个print语句之所以有效,是因为它在检查了其他名称空间后检查了全局变量名称空间,而没有找到变量
myvar

def changeVariable():
    global myvar
    myvar = "different data"
def printVariable():
    print(myvar)

button1 = Button(window, command = changeVariable)
button1.pack()
button2 = Button(window, command = printVariable)
button2.pack()

window.mainloop()
因此,如果我们把这些代码放在一起,我们将得到期望的结果

from tkinter import *
window = Tk()
variable = "data"

def changeVariable():
    global variable
    variable = "different data"

def printVariable():
    print(variable)

button1 = Button(window, command = changeVariable)
button1.pack()
button2 = Button(window, command = printVariable)
button2.pack()

window.mainloop()
这将生成一个如下所示的窗口:

如果我们先按底部按钮,然后按顶部按钮,然后再按底部按钮,结果是:


我想您不需要第一个
全局变量
。您的代码适合我。你确定你没有把“variable”拼错吗?我做了两个修改后,你的第二个例子对我很有用:
window=tkinter.Tk()
和add
window.mainloop()
结尾。@quamrana所说的:
global
指令在函数中用于告诉函数在全局名称空间中查找名称。在全局名称空间本身中使用它是没有意义的。但实际上,避免使用可修改的全局变量是一个好主意,因为它们破坏了程序模块化。实现这一点的好方法是将GUI定义为一个类,然后可以使用实例属性保存状态数据。顺便说一句,将tkinter作为tk导入是一种常见做法。然后你可以做一些事情,比如
button=tk.button(窗口)