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()