【问题标题】:Change variable with button in tkinter使用 tkinter 中的按钮更改变量
【发布时间】:2017-05-31 19:38:19
【问题描述】:

问题所在的代码相当大,所以我在这里起草一个手指画版本。

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

但现在它说'名称'变量'未定义'。

本质上,我怎样才能让变量“变量”通过 tkinter 中的按钮进行更改?我想使用 global 有错吗?

【问题讨论】:

  • 我认为你不需要第一个global variable
  • 您的代码对我有用。你确定你没有在某个地方拼错“变量”吗?
  • 在我进行两项更改后,您的第二个示例对我有效:window = tkinter.Tk() 并在末尾添加 window.mainloop()
  • @quamrana 所说的:global 指令用于函数内部,告诉函数在全局命名空间中查找名称。在全局命名空间本身中使用它是没有意义的。但实际上,避免使用可修改的全局变量是个好主意,因为它们破坏了程序的模块化。这样做的巧妙方法是将您的 GUI 定义为一个类,然后您可以使用实例属性来保存状态数据。顺便说一句,import tkinter as tk 是一种常见的做法。然后你可以做button = tk.Button(window)之类的事情。

标签: python tkinter


【解决方案1】:

您对 global 的使用有点不对劲。您不需要在所有地方都定义全局。让我们稍微分解一下。

您无需在全局命名空间中定义全局命名空间。

from tkinter import *
window = Tk()
myvar = "data" # this variable is already in the global namespace

这告诉函数在与变量myvar 交互时检查全局命名空间。

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

此打印语句有效,因为它在检查其他命名空间但未找到变量 myvar 后检查全局变量命名空间。

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

这会产生一个如下所示的窗口:

如果我们先按下底部按钮然后按下顶部按钮然后再按下底部按钮,我们得到的结果:

【讨论】:

    猜你喜欢
    • 2014-09-14
    • 1970-01-01
    • 1970-01-01
    • 2015-06-15
    • 2019-02-26
    • 1970-01-01
    • 2022-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多