Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/288.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_Callback_Tkinter_Parameter Passing - Fatal编程技术网

Python tkinter:更改最近单击的按钮的颜色

Python tkinter:更改最近单击的按钮的颜色,python,button,callback,tkinter,parameter-passing,Python,Button,Callback,Tkinter,Parameter Passing,我正试图有一个程序,它将有一个8x8按钮网格,点击后可以改变它们的颜色 我的代码如下所示: def Function(self): for i in range(8): for j in range(8): a=Button(self,width=2,height=1,command=lambda widget="button"+str(i)+str(j):Click1(self,widget)) a.grid(row=i,

我正试图有一个程序,它将有一个8x8按钮网格,点击后可以改变它们的颜色 我的代码如下所示:

def Function(self):
    for i in range(8):
        for j in range(8):
            a=Button(self,width=2,height=1,command=lambda widget="button"+str(i)+str(j):Click1(self,widget))
            a.grid(row=i,column=j)

def Click1(self):
    a["bg"]="blue"
我遇到的问题是,我不断收到一个错误,说:

NameError: name 'Click1' is not defined

有解决方案吗?

您没有保存对按钮的引用,因此以后无法更改它们。您应该做的是保存对按钮的引用,例如在列表列表(如网格)中,以便可以使用行和列编号访问它们

下面是一个工作示例:

from Tkinter import *

class App():
    def __init__(self, root):
        self.root = root

    def Function(self):
        self.grid = []
        for i in range(8):
            row = []
            for j in range(8):
                row.append(Button(self.root,width=2,height=1,command=lambda i=i, j=j: self.Click1(i, j)))
                row[-1].grid(row=i,column=j)
            self.grid.append(row)

    def Click1(self, i, j):
        self.grid[i][j]["bg"]="blue"

root = Tk()
app = App(root)
app.Function()
root.mainloop()

您没有保存对按钮的引用,因此以后无法更改它们。您应该做的是保存对按钮的引用,例如在列表列表(如网格)中,以便可以使用行和列编号访问它们

下面是一个工作示例:

from Tkinter import *

class App():
    def __init__(self, root):
        self.root = root

    def Function(self):
        self.grid = []
        for i in range(8):
            row = []
            for j in range(8):
                row.append(Button(self.root,width=2,height=1,command=lambda i=i, j=j: self.Click1(i, j)))
                row[-1].grid(row=i,column=j)
            self.grid.append(row)

    def Click1(self, i, j):
        self.grid[i][j]["bg"]="blue"

root = Tk()
app = App(root)
app.Function()
root.mainloop()

您没有保存对按钮的引用,因此以后无法更改它们。您应该做的是保存对按钮的引用,例如在列表列表(如网格)中,以便可以使用行和列编号访问它们

下面是一个工作示例:

from Tkinter import *

class App():
    def __init__(self, root):
        self.root = root

    def Function(self):
        self.grid = []
        for i in range(8):
            row = []
            for j in range(8):
                row.append(Button(self.root,width=2,height=1,command=lambda i=i, j=j: self.Click1(i, j)))
                row[-1].grid(row=i,column=j)
            self.grid.append(row)

    def Click1(self, i, j):
        self.grid[i][j]["bg"]="blue"

root = Tk()
app = App(root)
app.Function()
root.mainloop()

您没有保存对按钮的引用,因此以后无法更改它们。您应该做的是保存对按钮的引用,例如在列表列表(如网格)中,以便可以使用行和列编号访问它们

下面是一个工作示例:

from Tkinter import *

class App():
    def __init__(self, root):
        self.root = root

    def Function(self):
        self.grid = []
        for i in range(8):
            row = []
            for j in range(8):
                row.append(Button(self.root,width=2,height=1,command=lambda i=i, j=j: self.Click1(i, j)))
                row[-1].grid(row=i,column=j)
            self.grid.append(row)

    def Click1(self, i, j):
        self.grid[i][j]["bg"]="blue"

root = Tk()
app = App(root)
app.Function()
root.mainloop()

如果不运行此命令来验证它,我打赌您需要在命令中编写
self.Click1(widget)
,而不是
Click1(self,widget)
。但是如果这修复了错误,我打赌你会得到一个新的错误
Click1正好接受一个参数(给定2个)
,因为你正在将
self
widget
传递给一个只需要
self
的函数。如果您通过向
def
添加
widget
来解决这个问题,我打赌您会得到
namererror:a未定义
。如果您将
a
更改为
widget
,我打赌您会得到
TypeError:字符串索引必须是整数,而不是str
。。。天哪,这太狡猾了!除了最后一个:TypeError:“str”对象不支持项分配如果不运行此项来验证它,我打赌您需要在命令中编写
self.Click1(widget)
,而不是
Click1(self,widget)
。但是如果这修复了错误,我打赌你会得到一个新的错误
Click1正好接受一个参数(给定2个)
,因为你正在将
self
widget
传递给一个只需要
self
的函数。如果您通过向
def
添加
widget
来解决这个问题,我打赌您会得到
namererror:a未定义
。如果您将
a
更改为
widget
,我打赌您会得到
TypeError:字符串索引必须是整数,而不是str
。。。天哪,这太狡猾了!除了最后一个:TypeError:“str”对象不支持项分配如果不运行此项来验证它,我打赌您需要在命令中编写
self.Click1(widget)
,而不是
Click1(self,widget)
。但是如果这修复了错误,我打赌你会得到一个新的错误
Click1正好接受一个参数(给定2个)
,因为你正在将
self
widget
传递给一个只需要
self
的函数。如果您通过向
def
添加
widget
来解决这个问题,我打赌您会得到
namererror:a未定义
。如果您将
a
更改为
widget
,我打赌您会得到
TypeError:字符串索引必须是整数,而不是str
。。。天哪,这太狡猾了!除了最后一个:TypeError:“str”对象不支持项分配如果不运行此项来验证它,我打赌您需要在命令中编写
self.Click1(widget)
,而不是
Click1(self,widget)
。但是如果这修复了错误,我打赌你会得到一个新的错误
Click1正好接受一个参数(给定2个)
,因为你正在将
self
widget
传递给一个只需要
self
的函数。如果您通过向
def
添加
widget
来解决这个问题,我打赌您会得到
namererror:a未定义
。如果您将
a
更改为
widget
,我打赌您会得到
TypeError:字符串索引必须是整数,而不是str
。。。天哪,这太狡猾了!除了最后一个:TypeError:“str”对象不支持项目分配谢谢,这回答了我所有的问题!谢谢,这回答了我所有的问题!谢谢,这回答了我所有的问题!谢谢,这回答了我所有的问题!