我四处查看并尝试了提供的解决方案,但似乎无法更改我使用双for
循环生成的任何text
的button
循环在那里,这样我就可以把它们添加到list
的lists
的buttons
中,这样我就可以(假设)通过调用board_button[2][3]
或其他什么来方便地通过嵌套列表访问它们。它们也是在用户输入board_size
之后动态创建的,这样它就生成了一个nxn按钮网格。这些都是在一个类方法中完成的,另外一个类方法应该在按钮调用时更改button
的text
我试过使用here提供的解决方案,但没有一个能解决我的问题
请原谅这一长段代码,但我真的认为我的制作方法可能导致了这个问题,并因此给出了更多的见解
from tkinter import filedialog
from tkinter import *
class MainWindow(Frame):
board_size = None
file_input = None
board_buttons = None
board_strvars = None
row = []
def __init__ (self, parent):
Frame.__init__(self, parent)
# initialize widgets but don't show them yet
self.initWidgets()
# show the starting window
self.startWindow()
def generateBoard(self, to_forget=None):
# hides the groups of the method that called it
if to_forget != None:
for i in to_forget:
self.row[i].forget()
# get the board_size from user
self.board_size = int(self.size_entry.get())
# initialize text variables for each button
self.board_strvars = []
for i in range(self.board_size):
self.row_strvars=[]
for j in range(self.board_size):
var = StringVar()
var.set(" ")
self.row_strvars.append(var)
self.board_strvars.append(self.row_strvars)
# insert list of lists of buttons here
self.row[1].pack(fill=X)
self.board_buttons = []
for i in range(self.board_size):
self.row_buttons=[]
for j in range(self.board_size):
self.row_buttons.append(Button(self.row[1], textvariable=self.board_strvars[i][j], command=lambda:self.place(i, j)))
self.row_buttons[j].grid(row=i, column=j)
self.board_buttons.append(self.row_buttons)
# for solve and back button
self.row[2].pack(fill=X)
def initWidgets(self):
# create the rows or groups of widgets
for i in range(3):
self.row.append(Frame())
# row 0; startWindow
self.size_entry = Entry(self.row[0])
self.size_entry.pack(fill=X, side=LEFT)
self.size_button = Button(self.row[0], text="Enter", command=lambda:self.generateBoard([0]))
self.size_button.pack(fill=X, side=LEFT)
self.load_button = Button(self.row[0], text="Load", command=self.loadFile)
self.load_button.pack(fill=X, side=LEFT)
# row 2; generateBoard
self.solve_button = Button(self.row[2], text="Solve", command=self.showSolutions)
self.solve_button.pack(fill=X, side=LEFT)
self.back_button = Button(self.row[2], text="Back", command=lambda:self.startWindow(to_forget=[0,2], to_destroy=[1]))
self.back_button.pack(fill=X, side=RIGHT)
def loadFile(self):
print("file loaded!")
def place(self, i, j):
if self.board_strvars[i][j].get() == " ":
self.board_strvars[i][j].set("C")
else:
self.board_strvars[i][j].set(" ")
def showSolutions(self):
print("solutions shown!")
def startWindow(self, to_forget=None, to_destroy=None):
# hides the groups of the method that called it
if to_forget != None:
for i in to_forget:
self.row[i].forget()
# destroys the groups' child widgets and hides the group
if to_destroy != None:
for i in to_destroy:
for child in self.row[i].winfo_children():
child.destroy()
self.row[i].forget()
self.row[0].pack(fill=X)
if __name__ == "__main__":
root=Tk()
root.title("test")
app = MainWindow(root)
root.mainloop()
我最初想定义一个函数来改变调用它的text
的button
。但到目前为止我还没找到办法
在做文章中提供的解决方案时,我没有将任何更改链接到按钮。但在我提供的代码中,我使用了StringVar()
作为button
的textvariable
。但是,无论单击哪个按钮,它都只更改最后一行、最后一列按钮元素。它的工作方式应该是,被点击的按钮,将得到它的文本更改
谢谢
更改
lambda
函数以强制关闭:还要注意,最好不要调用自己的方法
place
,因为Tk中已经有了place
方法相关问题 更多 >
编程相关推荐