我只想用一个按钮来改变一个变量的值,我不想像那样创建一个新的完整函数:
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()
