【问题标题】:Making Buttons that Locate Themselves in a List制作在列表中定位自己的按钮
【发布时间】:2015-12-07 14:52:01
【问题描述】:

我正在尝试创建可自行删除的按钮。在下面的代码中,我在 for 循环中创建了一些按钮,将它们附加到列表中,并将它们网格化。我可以在按钮列表的某个索引位置删除和移除任何按钮,但需要弄清楚如何让每个按钮在按钮列表中定位自己。

from tkinter import *
import random

class App(Tk):
    def __init__(self):
        Tk.__init__(self)

        self.totalButtons = random.randint(5, 25)

        # The buttons will be stored in a list
        self.buttons = []
        self.labels = []

        self.createButtons()

    def createButtons(self):
        for i in range(0, self.totalButtons):
            # Here I create a button and append it to the buttons list
            self.buttons.append(Button(self, text = i, command = self.removeButton))

            # Now I grid the last object created (the one we just created)
            self.buttons[-1].grid(row = i + 1, column = 1)

            # Same thing for the label
            self.labels.append(Label(self, text = i))
            self.labels[-1].grid(row = i + 1, column = 0)

    def removeButton(self):
        # When a button is clicked, buttonIndex should be able to find the index position of that button in self.buttons
        # For now I set it to 0, which will always remove the first (top) button
        indexPosition = 0

        # Takes the button (in this case, the first one) off the grid
        self.buttons[indexPosition].grid_forget()

        # Removes that button from self.buttons
        del self.buttons[indexPosition]

        # Same for the label
        self.labels[indexPosition].grid_forget()
        del self.labels[indexPosition]


def main():
    a = App()
    a.mainloop()

if __name__ == "__main__":
    main()

谢谢!

【问题讨论】:

  • 为什么需要将它们存储在列表中?
  • 前几天我遇到了完全相同的问题,试图在按下按钮后在列表中找到按钮的索引。

标签: python arrays python-3.x tkinter


【解决方案1】:
command = lambda idx=i: self.removeButton(idx)

这里的 lambda 从您的范围中获取值 i 并将其分配给 idx 并传递给函数。此函数调用现在对每个按钮都是唯一的,因此它们具有与其索引相对应的值。

for i, btn in enumerate(self.buttons):
    btn['command'] = lambda idx=i: self.removeButton(idx)

因为您要从列表中删除每个按钮,您需要为命令参数分配一个新值,以正确反映列表中现有按钮的新位置。

    def createButtons(self):
        for i in range(0, self.totalButtons):
            # Here I create a button and append it to the buttons list
            self.buttons.append(Button(self, text = i, command = lambda idx=i: self.removeButton(idx)))

            # Now I grid the last object created (the one we just created)
            self.buttons[-1].grid(row = i + 1, column = 1)

            # Same thing for the label
            self.labels.append(Label(self, text = i))
            self.labels[-1].grid(row = i + 1, column = 0)

    def removeButton(self, i):
        # Takes the button at index i off the grid
        self.buttons[i].grid_forget()

        # Removes that button from self.buttons
        del self.buttons[i]

        # Same for the label
        self.labels[i].grid_forget()
        del self.labels[i]

        # Assign new values for index position
        for new_i, btn in enumerate(self.buttons):
            btn['command'] = lambda idx=new_i: self.removeButton(idx)

【讨论】:

  • 什么是 idx?我可以将 idx 设置为任何变量吗?
  • 只是我用来表示索引的一个变量名。你可以随心所欲地称呼它,甚至是i。我只是使用了不同的名称以避免混淆
猜你喜欢
  • 1970-01-01
  • 2012-06-18
  • 2015-09-16
  • 2016-01-22
  • 1970-01-01
  • 1970-01-01
  • 2020-07-14
  • 1970-01-01
  • 2010-11-23
相关资源
最近更新 更多