Skip to main content
 首页 » 编程设计

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

2025年05月04日17freeliver54

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

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

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

请您参考如下方法:

i need to make this for 6 buttons...

如果每个按钮修改相同的全局变量,则让 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 

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


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

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