繁体   English   中英

使用按钮更改变量的值 (Tkinter)

[英]Change the value of a variable with a button (Tkinter)

我想只用一个按钮来改变一个变量的值,我不想像这样创建一个新的整个函数:

from Tkinter import *
variable = 1
def makeSomething():
    global variable
    variable = 2
root = Tk()
myButton = Button(root, text='Press me',command=makeSomething).pack()

我怎么能这样做? (我需要为六个按钮这样做,使六个功能不是一个选项)

我需要为 6 个按钮做这个...

如果每个按钮修改相同的全局变量,则让make_something接受一个value参数:

from tkinter import Tk, Button
variable = 1
def make_something(value):
    global variable
    variable = value
root = Tk()
Button(root, text='Set value to four',command=lambda *args: make_something(4)).pack()
Button(root, text='Set value to eight',command=lambda *args: make_something(8)).pack()
Button(root, text='Set value to fifteen',command=lambda *args: make_something(15)).pack()
#...etc

如果每个按钮修改一个不同的全局变量,那么将所有全局变量压缩成一个全局字典,然后make_something可以对其进行修改。

from tkinter import Tk, Button
settings = {"foo": 1, "bar": 1, "baz": 1}

def make_something(name):
    settings[name] = 2

root = Tk()
Button(root, text='Set foo',command=lambda *args: make_something("foo")).pack()
Button(root, text='Set bar',command=lambda *args: make_something("bar")).pack()
Button(root, text='Set baz',command=lambda *args: make_something("baz")).pack()
#...etc

无论哪种情况,您仍然只需要一个功能。


如果 lambdas 不符合您的口味,您可以使用嵌套函数为每个命令创建单独的可调用对象:

from tkinter import Tk, Button
settings = {"foo": 1, "bar": 1, "baz": 1}

def make_callback(key):
    def make_something(*args):
        settings[key] = 2
    return make_something

root = Tk()
Button(root, text='Set foo',command=make_callback("foo")).pack()
Button(root, text='Set bar',command=make_callback("bar")).pack()
Button(root, text='Set baz',command=make_callback("baz")).pack()
#...etc

...您可以通过使用类实例的属性来避免全局变量:

from tkinter import Tk, Button

class GUI:
    def __init__(self):
        self.settings = {"foo": 1, "bar": 1, "baz": 1}
        self.root = Tk()
        Button(self.root, text='Set foo',command=self.make_callback("foo")).pack()
        Button(self.root, text='Set bar',command=self.make_callback("bar")).pack()
        Button(self.root, text='Set baz',command=self.make_callback("baz")).pack()
        #...etc

    def make_callback(self, key):
        def make_something(*args):
            self.settings[key] = 2
        return make_something

gui = GUI()

顺便说一句,不要这样做:

myButton = Button(root).pack()

这会将pack()的结果分配给 myButton,因此 myButton 将为None而不是引用您的按钮。 相反,请执行以下操作:

myButton = Button(root)
myButton.pack()

更新:我让它(几乎)正常工作此代码有效,但我想实时显示当我取消注释这两件事时,它不再做任何事情

def BotPlay_Button():
    nPlay = entryN.get()
    jlist = [Joueur(File1,True,File1),Joueur(File2,True,File1)]
    Partie = Partie_Object(jlist)
    for i in range(int(nPlay)):
        Play_Partie(Partie)
        xList.append(i)
        y1List.append(bot1.score)
        y2List.append(bot2.score)
        # windo.update_idletasks()
        # windo.update()

我是初学者,但我认为你应该给函数 2 个参数一个用于变量名,一个用于它的值,如下所示

def makeSomething(variableName,variableValue)
    variableName = variableValue

但正如我所说,我是初学者,所以我可能是错的

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM