我想在按下按钮时更改按钮的颜色。
map = []
for y in range(20):
for x in range(20):
map.append(0)
def button_map():
btn_c = ""
if map[x+20*y] == 1:
btn_c ="red"
elif map[x+20*y] == 2:
btn_c ="blue"
elif map[x+20*y] == 0:
btn_c ="orange"
return btn_c
def button_map_set(x, y):
if map[x+20*y] == 1:
map[x+20*y] = 0
elif map[x+20*y] == 0:
map[x+20*y] = 1
main = Tk()
frame1 = Frame(main)
frame1.pack()
for y in range(20):
for x in range(20):
我已经测试了这个
def test():
button_map_set(x, y)
此
test = button_map_set(x, y)
和这个
btn.bind("<btn>", button_map_set(x, y)
btn = Button(framex, command = test, bg = button_map())
main.mainloop()
会发生什么:它在声明时执行,但在按下时不执行
答案 0 :(得分:1)
bind
和command=
期望“函数名称” - 它表示没有()和参数。
如果您需要使用参数分配函数,请使用lambda
Button(..., command=lambda:button_map_set(x, y))
或创建没有参数的函数
def test():
button_map_set(x, y)
Button(..., command=test)
如果您在按下按钮时需要运行更多功能,请使用功能
def test():
button_map_set(x, y)
button_map()
Button(..., command=test)
-
bind
也一样,但bind
发送event
,因此函数必须接收此信息
def test(event):
button_map_set(x, y)
button_map()
btn.bind("<Button-1>", test)
<Button-1>
表示鼠标左键单击。
-
如果您需要对bind
和command=
使用相同的功能,则可以对None
使用默认值event
def test(event=None):
button_map_set(x, y)
button_map()
Button(..., command=test) # run `test(None)`
btn.bind("<Button-2>", test) # run `test(event)`
<Button-2>
表示单击鼠标右键。
BTW:拥有3种颜色的按钮
import tkinter as tk
class MyButton(tk.Button):
colors = ['red', 'blue', 'orange']
def __init__(self, *args, **kwargs):
tk.Button.__init__(self, *args, **kwargs)
# current color number
self.state = 0
# set color
self.config(bg=self.colors[self.state])
# assign own function to click button
self.config(command=self.change_color)
def change_color(self):
# change current color number
self.state = (self.state + 1) % len(self.colors)
# set color
self.config(bg=self.colors[self.state])
root = tk.Tk()
for __ in range(5):
MyButton(root, text="Hello World").pack()
root.mainloop()
您可以向列表colors
添加更多颜色,它也可以使用。