如何解决基于按钮索引或文本的Tkinter更改按钮方法
因此,我正在编写一个程序,可让您创建某些应用程序组并将其放入预设中。例如,一个摄影预设可能包含photoshop并在其中进行斑点化。
创建按钮以打开这些应用程序时出现问题。它的工作方式是将预设的名称与该预设中的应用一起放入列表中的文本文件中。然后将该列表放入列表列表,每个预设列表一个。
import tkinter as tk
root = tk.Tk()
presetList = ["Name1","Program1","Program2"],["Name2","Program3","Program4"],["Name3","Program5","Program6"]
nameList = ["Name1","Name2","Name3"]
def openPreset():
#I need this to open based on what button is pressed. So if you press the
Name1 button,it calls the info from the list that Name1 is in.
print(presetList)
x=7
y=10
for name in nameList:
nameButton = tk.Button(root,text=name,width=20,height=1,command=openPreset)
nameButton.place(x=x,y=y)
y+=25
root.mainloop()
上面的代码是我正在使用的代码。我想知道的是,有没有一种方法可以使链接到代码最后一部分中的按钮的方法成为可能,我可以根据按钮中的文本使它做不同的事情吗?这样,当我选择“预设1”时,它会知道只在“预设1”所在的同一列表中打开应用程序吗?我已经尝试了多种不同的方法,但我觉得我尝试执行此操作的方法可能行不通,而且还有另一种方法可以解决此问题。
编辑:我对代码进行了最少的编辑,以便有人可以帮助我。我需要绑定到每个按钮的功能,以基于按下的按钮获取每个列表。这些将是将来用户输入的预设,因此如果语句可能不起作用,则非常简单。
解决方法
您可以通过创建一个lambda
函数来实现此目的,该函数的默认参数值包含所需的信息(并修改回调函数以接受它。
这是我的意思:
import tkinter as tk
root = tk.Tk()
presetList = (["Name1","Program1","Program2"],["Name2","Program3","Program4"],["Name3","Program5","Program6"])
nameList = ["Name1","Name2","Name3"]
def openPreset(name):
print(name)
x=7
y=10
for name in nameList:
nameButton = tk.Button(root,text=name,width=20,height=1,command=lambda name=name: openPreset(name))
nameButton.place(x=x,y=y)
y+=25
root.mainloop()
或者,您也可以按常规方式在循环内创建一个函数(这可以说是更易读且同样有效的方法)。
for name in nameList:
def callback(name=name):
return openPreset(name)
nameButton = tk.Button(root,command=callback)
nameButton.place(x=x,y=y)
y+=25
与常规函数一样,lambda
函数不需要具有默认参数,甚至不需要任何默认参数。但是,这里需要一个“捕获” name
变量的当前值,因为它会随着for
循环的执行而改变,否则所有函数将为其接收相同的参数值(即{ {1}},因为这是循环结束时的最终值。
我还建议您阅读并开始遵循PEP 8 - Style Guide for Python Code,以便您的代码更具可读性并遵循约定。
更新
如果您想将更多信息传递给回调函数,而不仅仅是预设名称,那么将所有信息传递给回调函数将非常简单,如下所示-请注意,不再需要单独的{{ 1}}。
"Name3"
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。