按钮参数“command”在声明时执行,但在按下时不执行

时间:2016-02-03 11:34:28

标签: python button tkinter

我想在按下按钮时更改按钮的颜色。

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

会发生什么:它在声明时执行,但在按下时不执行

1 个答案:

答案 0 :(得分:1)

bindcommand=期望“函数名称” - 它表示没有()和参数。

如果您需要使用参数分配函数,请使用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>表示鼠标左键单击。

-

如果您需要对bindcommand=使用相同的功能,则可以对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添加更多颜色,它也可以使用。