Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在tkinter中更改按钮_Python_Button_Tkinter - Fatal编程技术网

Python 在tkinter中更改按钮

Python 在tkinter中更改按钮,python,button,tkinter,Python,Button,Tkinter,我有这个代码,但我不知道如何让显示功能工作。在没有硬编码变量名的情况下,如何调用按钮并更改文本 您不能将命令分配给具有被调用函数(display(x,y))的按钮,因为这会将此函数返回的内容(None)分配给按钮的命令。您需要指定可调用(显示)来代替 要执行此操作并传递参数,您需要使用lambda: win=Tk() level1=matrixmaker(4) def display(x,y): if z["text"] == " ": # switch to Goodbye

我有这个代码,但我不知道如何让显示功能工作。在没有硬编码变量名的情况下,如何调用按钮并更改文本

您不能将命令分配给具有被调用函数(
display(x,y)
)的按钮,因为这会将此函数返回的内容(
None
)分配给按钮的命令。您需要指定可调用(
显示
)来代替

要执行此操作并传递参数,您需要使用lambda:

win=Tk()
level1=matrixmaker(4)

def display(x,y): 
if z["text"] == " ":
    # switch to Goodbye
    z["text"] = level1[x][y]
else:
    # reset to Hi
    z["text"] = " "


for x in range(0,4):
    for y in range(0,4):
        z=Button(win,text=" ", command=display(x,y))
        z.grid(row=x,column=y)
此外,您还需要更改
display()
函数以接受另一个参数
z
,以便更改正确的按钮(并更正缩进):


您不能将命令分配给具有被调用函数(
display(x,y)
)的按钮,因为这将此函数返回的内容(
None
)分配给按钮的命令。您需要指定可调用(
显示
)来代替

要执行此操作并传递参数,您需要使用lambda:

win=Tk()
level1=matrixmaker(4)

def display(x,y): 
if z["text"] == " ":
    # switch to Goodbye
    z["text"] = level1[x][y]
else:
    # reset to Hi
    z["text"] = " "


for x in range(0,4):
    for y in range(0,4):
        z=Button(win,text=" ", command=display(x,y))
        z.grid(row=x,column=y)
此外,您还需要更改
display()
函数以接受另一个参数
z
,以便更改正确的按钮(并更正缩进):


在Tkinter中,
命令
参数是对函数的引用,而不是函数本身。必须将参数设置为不带参数的
command=display
。请参见此处:另外,您正在调用一个只有两个参数的三参数函数(无论如何都不能添加)。使用
command=lambda a=x,b=y:display(a,b)
我添加了lambda,但是现在每当我在网格上单击任何东西时,它只会更改右下角的按钮,因为您更改了
z
——但是
z
是在
循环中为
创建的最后一个按钮。在Tkinter中,
命令
参数是对函数的引用,而不是函数本身。必须将参数设置为不带参数的
command=display
。请参见此处:另外,您正在调用一个只有两个参数的三参数函数(无论如何都不能添加)。使用
command=lambda a=x,b=y:display(a,b)
我添加了lambda,但现在每当我在网格上单击任何内容时,它只会更改右下角的按钮,因为您更改了
z
-但是
z
是在
循环中为
创建的最后一个按钮。您应该添加-OP需要使用
def display(x,y,z)
代替
def display(x,y)
@furas感谢您指出这一点(在OP编辑问题之前,它被定义为
def display(x,y,z)
),您应该添加-OP需要使用
def display(x,y,z)
代替
def display(x,y)
@furas感谢您指出这一点(在OP编辑问题之前,它被定义为
def display(x,y,z)
def display(x,y,z): 
    if z["text"] == " ":
        # switch to Goodbye
        z["text"] = level1[x][y]
    else:
        # reset to Hi
        z["text"] = " "