如果按钮名是在python的for循环中创建的,如何访问它?

2024-10-04 03:20:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在尝试创建一个GUI,用于与.txt文件中的行进行交互,以便对某些冷藏箱的内容进行排序。但是,当我创建许多带有for循环的按钮时,很难与特定行交互,例如:

def create_boxes(self):
    for r in range(0,10):
        for c in range(0,10):
            self.button = Button(root, text='%s.%s'%(r,c),borderwidth=1 ,command= lambda: self.replace_line("Freezercontent.txt", r*10+c , input("What would you like in this slot"))).grid(row=r,column=c+5)

在replace line函数中,第二个参数是特定按钮需要更改的行号。我的解决方案不起作用,因为当使用命令调用lambda函数时,for循环已经完成。意味着我点击的每一个按钮只会改变最后一行

如何访问用text="somename"参数指定的按钮名称?还是有更聪明的方法

谢谢,向埃米尔H


Tags: 文件lambda函数textinselftxtfor
3条回答

按照当前的编码方式,它将允许您访问用self.button创建的最后一个按钮。你可以把它改成一本字典,然后把它们都存储在那里:

def create_boxes(self):
    self.buttons = {}
    for r in range(10):
        for c in range(10):
            text = '%s.%s' % (r, c)
            self.buttons[text] = Button(root, text=text, borderwidth=1, command=...)

然后您可以使用self.buttons['1.1']来获取所需的按钮,等等

您可以使用列表来存储所有按钮:

def create_boxes(self):
    def make_replacer(r, c):
        def replacer():
            prompt = "What would you like in this slot"
            self.replace_line("Freezercontent.txt",
                              r * 10 + c,
                              input(prompt))).grid(row=r,column=c+5)
        return replacer

    self.buttons = [Button(root,
                           text='%s.%s' % (r,c),
                           borderwidth=1,
                           command=make_replacer(r, c))
                    for r in range(0,10)
                    for c in range(0,10)]

问题出在别处

我建议不要使用lambda,而是创建一个类,这个类可以在使用这些按钮的坐标调用button时进行初始化

内在的工作将在课堂本身,它将知道它的坐标。你应该按照我之前的建议创建按钮数组

class Some:
    def __init__(self, r, c):
       self.r = r
       self.c = c
    def __call__(self):
       # do what you need and access coords as self.c and self.r

 Button(root, text='%s.%s' % (r,c), borderwidth=1, command=Some(r, c) ...

相关问题 更多 >