Python 如何将按钮链接到tkinter中的标签,而不显式地将它们声明为变量

Python 如何将按钮链接到tkinter中的标签,而不显式地将它们声明为变量,python,user-interface,tkinter,Python,User Interface,Tkinter,我想用标签链接我的按钮,但是我不允许显式地将它们声明为变量,因为我将使用循环(例如,按钮标签对的数量将取决于用户输入) 然而,这不起作用。似乎我不能只传递对象,还必须传递它的显式名称。有没有办法解决这个问题?尝试向lambda添加一个参数。这样,它应该单独使用每个按钮,而不仅仅是定义的最后一个按钮/标签。下面是一个简单的可执行示例 import tkinter as tk def changetext(label): label.config(text="button on

我想用标签链接我的按钮,但是我不允许显式地将它们声明为变量,因为我将使用循环(例如,按钮标签对的数量将取决于用户输入)


然而,这不起作用。似乎我不能只传递对象,还必须传递它的显式名称。有没有办法解决这个问题?

尝试向lambda添加一个参数。这样,它应该单独使用每个按钮,而不仅仅是定义的最后一个按钮/标签。下面是一个简单的可执行示例

import tkinter as tk

def changetext(label):
    label.config(text="button on my left has been pressed")

root = tk.Tk()
desired_number = 5

for i in range(desired_number):
    button = tk.Button(root,text=f"Button {i}")
    button.grid(row = i, column = 0)
    label = tk.Label(root)
    label.grid(row = i, column = 1)
    button.config(command = lambda x=label: changetext(x))


root.mainloop()

对于动态创建的小部件,您可以将它们存储在阵列中以供以后访问。在这种情况下,可以将标签索引传递给按钮处理程序

lstbtn = []
lstlbl = []

for i in range(desired_number):
    button = tk.Button(self.mainframe)
    button.grid(row = i, column = 0)
    lstbtn.append(button)  # save for later
    label = tk.Label(self.mainframe)
    label.grid(row = i, column = 1)
    lstlbl.append(label)  # save for later

    button.config(command = lambda: self.changetext(i)) # pass label index

@staticmethod
def changetext(idx):  # label index
    lstlbl[idx].config(text="button on my left has been pressed")

如果您使用的是Python3.8+,那么您可以使用walrus(
:=
)并在两行代码中完成您想要的内容。在
按钮
之前,将
标签
添加到
网格
并不重要。他们的
网格
位置已定义,这些是他们将驻留的位置

使用像
desired\u count
change\u label
这样的名称太通用了。我更改了这些名称,以更好地反映它们所指的内容

import tkinter as tk

def indicate_button(label):
    label['text'] = 'corresponding button pressed'
    
root = tk.Tk()
combo_count = 5

for i in range(combo_count):
    (lbl := tk.Label(root, width=25)).grid(row=i, column=1)
    tk.Button(root, text=f"Button {i}", command=lambda L=lbl: indicate_button(L)).grid(row=i, column=0)

root.mainloop()
另一种方法是将
标签
存储在列表中。我知道这个答案已经给出了,但是他们的版本是混乱的,不完整的,并且有错误。我还扩展了这个示例,以展示这是如何有用的

import tkinter as tk

root = tk.Tk()
combo_count = 5

labels  = [None]*combo_count

def indicate_button(i):
    if i < len(labels) and labels[i]:
        for n, lbl in enumerate(labels):
            #assign target label and clear the others
            lbl['text'] = 'corresponding button pressed' if n == i else ''
    else:
        #do something about an out of range or empty index
        pass    

for i in range(combo_count):
    labels[i] = tk.Label(root, width=25)
    labels[i].grid(row=i, column=1)
    tk.Button(root, text=f'Button {i}', command=lambda i=i: indicate_button(i)).grid(row=i, column=0)


root.mainloop()
将tkinter作为tk导入
root=tk.tk()
组合计数=5
标签=[无]*组合计数
def指示按钮(i):
如果i
搜索此网站,查找有关在循环中创建按钮的问题。这个问题已经被问过很多次了。
import tkinter as tk

root = tk.Tk()
combo_count = 5

labels  = [None]*combo_count

def indicate_button(i):
    if i < len(labels) and labels[i]:
        for n, lbl in enumerate(labels):
            #assign target label and clear the others
            lbl['text'] = 'corresponding button pressed' if n == i else ''
    else:
        #do something about an out of range or empty index
        pass    

for i in range(combo_count):
    labels[i] = tk.Label(root, width=25)
    labels[i].grid(row=i, column=1)
    tk.Button(root, text=f'Button {i}', command=lambda i=i: indicate_button(i)).grid(row=i, column=0)


root.mainloop()