python/GUI创建:如何将标签的文本重新配置为';匹配所单击按钮的文本';
我已经浏览了关于标签/按钮/配置的多篇相关文章,到目前为止还没有找到任何解释这个确切问题的文章。我以前成功地编写了基本标签配置程序(使用“函数”和“命令=”以及“lambda”等),但它们只涉及使用设置字符串(text=“string”)的函数中的配置代码。 我打算在这个程序中做的是将标签文本更改为“按钮”中相同文本的文本,因此当用户单击按钮时,标签将显示带有附带字符串的文本(“联系人信息:”+按钮已单击) 我确信问题在于我的“功能代码”本身(尤其是行的后半部分的格式),下面的“for循环”中的“button creation”行或“button creation”行可能需要编辑(或者两者都需要编辑) 我猜有不止一条途径可以实现这一点,考虑到所有的“按钮文本”都作为键(名称)包含在字典中,因此任何类型的建议,无论哪种方式,都将受到极大的赞赏,我是Python新手,所以我确信这对于有经验的程序员来说都是一个简单易行的问题python/GUI创建:如何将标签的文本重新配置为';匹配所单击按钮的文本';,python,python-3.x,tkinter,Python,Python 3.x,Tkinter,我已经浏览了关于标签/按钮/配置的多篇相关文章,到目前为止还没有找到任何解释这个确切问题的文章。我以前成功地编写了基本标签配置程序(使用“函数”和“命令=”以及“lambda”等),但它们只涉及使用设置字符串(text=“string”)的函数中的配置代码。 我打算在这个程序中做的是将标签文本更改为“按钮”中相同文本的文本,因此当用户单击按钮时,标签将显示带有附带字符串的文本(“联系人信息:”+按钮已单击) 我确信问题在于我的“功能代码”本身(尤其是行的后半部分的格式),下面的“for循环”中的
# The purpose of this program is to produce a GUI that acts as a 'contacts
#info retriever', when a 'contact' 'button' is clicked it displays the contact
#information of that person
# Make a 'dictionary' containing contact info
contacts = { 1: {"Name" : "Max", "Address" : "18 Fake Street, Hollywood", "Mobile" : "07542564872"},
2: {"Name" : "Brian", "Address" : "17 Fake Boulevard, Hollywood", "Mobile" : "07895465231"},
3: {"Name" : "Sally", "Address" : "19 Hill Valley, Hollywood", "Mobile" : "07956423145"},
4: {"Name" : "Steve", "Address" : "22 Fake House, Hollywood", "Mobile" : "07456213895"},
5: {"Name" : "Sara", "Address" : "46 Fake Drive, Hollywood", "Mobile" : "07652348192"},
6: {"Name" : "Kevin", "Address" : "18 Labyrinth Avenue, Hollywood", "Mobile" : "07563245196"},
7: {"Name" : "Paula", "Address" : "38 Fake Drive, Hollywood", "Mobile" : "07354695488"},
8: {"Name" : "Dave", "Address" : "Haystack Farm, Hollywood", "Mobile" : "07854623198"},
9: {"Name" : "Mary", "Address" : "Fake Valley, CA", "Mobile" : "07564289315"},
10:{"Name" : "Anastasia", "Address" : "Some Street, Hollywood", "Mobile" : "07546321595"}}
# Import 'GUI creation' module
import tkinter
# Create a 'window'
window = tkinter.Tk()
# Give the window a 'title'
window.title("Phonebook")
# Import an 'ico' file for icon
window.wm_iconbitmap("Moon Full.ico")
# Create a 'label' that displays opening instruction message at top
lbl = tkinter.Label(window, text="Click a contact to show their details:")
# 'Pack' the 'label'
lbl.pack()
# A 'function' for the 'reconfiguration' of 'labels' (changing their output)
def changeLabel():
lbl2.configure(text="Details for " + str(btn))
# 'Dynamically create' 'buttons' using a 'for loop' as so
for i in contacts:
#creates 'button' for what ever 'sub dictionary' (contact) the 'loop'
#is currently on
btn = tkinter.Button(window, text=contacts [i] ["Name"], command=changeLabel)
#'pack' the 'button'
btn.pack()
# Create a 'label' to display 'who the info belongs to'
lbl2 = tkinter.Label(window, text="No contact selected")
# Pack label
lbl2.pack()
# Draw the 'window', engage program
window.mainloop()
一种方法是在创建时将信息绑定到按钮,并在单击按钮时将此信息作为参数传递:
contacts = { 1: {"Name" : "Max", "Address" : "18 Fake Street, Hollywood", "Mobile" : "07542564872"},
2: {"Name" : "Brian", "Address" : "17 Fake Boulevard, Hollywood", "Mobile" : "07895465231"},
3: {"Name" : "Sally", "Address" : "19 Hill Valley, Hollywood", "Mobile" : "07956423145"},
4: {"Name" : "Steve", "Address" : "22 Fake House, Hollywood", "Mobile" : "07456213895"},
5: {"Name" : "Sara", "Address" : "46 Fake Drive, Hollywood", "Mobile" : "07652348192"},
6: {"Name" : "Kevin", "Address" : "18 Labyrinth Avenue, Hollywood", "Mobile" : "07563245196"},
7: {"Name" : "Paula", "Address" : "38 Fake Drive, Hollywood", "Mobile" : "07354695488"},
8: {"Name" : "Dave", "Address" : "Haystack Farm, Hollywood", "Mobile" : "07854623198"},
9: {"Name" : "Mary", "Address" : "Fake Valley, CA", "Mobile" : "07564289315"},
10:{"Name" : "Anastasia", "Address" : "Some Street, Hollywood", "Mobile" : "07546321595"}}
import tkinter
window = tkinter.Tk()
window.title("Phonebook")
lbl = tkinter.Label(window, text="Click a contact to show their details:")
lbl.pack()
def changeLabel(text):
"""A 'function' for the 'reconfiguration' of 'labels'
(changing their output)
"""
lbl2.configure(text="Details for " + text)
for i in contacts:
btn = tkinter.Button(window, text=contacts[i]["Name"], command=lambda text=contacts[i]["Name"]:changeLabel(text))
btn.pack()
lbl2 = tkinter.Label(window, text="No contact selected")
lbl2.pack()
window.mainloop()
或者:
根据@BrianOakley在评论中的建议:由于contacts是全局的,如果代码将索引传递给函数而不是复杂的lambda语句,那么代码可能更容易调试和维护。(请参阅下面的代码以了解此替代方案,并且可以说是更健壮的解决方案)
一种方法是在创建时将信息绑定到按钮,并在单击按钮时将此信息作为参数传递:
contacts = { 1: {"Name" : "Max", "Address" : "18 Fake Street, Hollywood", "Mobile" : "07542564872"},
2: {"Name" : "Brian", "Address" : "17 Fake Boulevard, Hollywood", "Mobile" : "07895465231"},
3: {"Name" : "Sally", "Address" : "19 Hill Valley, Hollywood", "Mobile" : "07956423145"},
4: {"Name" : "Steve", "Address" : "22 Fake House, Hollywood", "Mobile" : "07456213895"},
5: {"Name" : "Sara", "Address" : "46 Fake Drive, Hollywood", "Mobile" : "07652348192"},
6: {"Name" : "Kevin", "Address" : "18 Labyrinth Avenue, Hollywood", "Mobile" : "07563245196"},
7: {"Name" : "Paula", "Address" : "38 Fake Drive, Hollywood", "Mobile" : "07354695488"},
8: {"Name" : "Dave", "Address" : "Haystack Farm, Hollywood", "Mobile" : "07854623198"},
9: {"Name" : "Mary", "Address" : "Fake Valley, CA", "Mobile" : "07564289315"},
10:{"Name" : "Anastasia", "Address" : "Some Street, Hollywood", "Mobile" : "07546321595"}}
import tkinter
window = tkinter.Tk()
window.title("Phonebook")
lbl = tkinter.Label(window, text="Click a contact to show their details:")
lbl.pack()
def changeLabel(text):
"""A 'function' for the 'reconfiguration' of 'labels'
(changing their output)
"""
lbl2.configure(text="Details for " + text)
for i in contacts:
btn = tkinter.Button(window, text=contacts[i]["Name"], command=lambda text=contacts[i]["Name"]:changeLabel(text))
btn.pack()
lbl2 = tkinter.Label(window, text="No contact selected")
lbl2.pack()
window.mainloop()
或者:
根据@BrianOakley在评论中的建议:由于contacts是全局的,如果代码将索引传递给函数而不是复杂的lambda语句,那么代码可能更容易调试和维护。(请参阅下面的代码以了解此替代方案,并且可以说是更健壮的解决方案)
谢谢你Reblochon,这看起来很有希望,我会测试一下,让你知道,它是成功的,非常感谢我确实怀疑“lambda”可以用在这一点上,但之前我只是用它来更改按钮本身的文本,等csince
contacts
是全局的,如果您只是将索引传递给函数,而不是使用复杂的lambda
语句,那么代码将更易于调试和维护。同意,这是一个很好的建议,谢谢@BrianOakley。我在回答中添加了一个内容。@BryanOakley有趣的是,就在今天登录之前,我刚刚完成了程序,并尝试了添加其他标签(移动/地址)的确切方法,尽管我在让函数能够访问字典方面遇到了问题(它产生了一个错误),这使我假设无法从函数中访问词典,但这可能是我自己的格式错误,因为我的“按钮创建代码”与您的不同,我在文本“参数”中使用了与“传递”类似的方法“num=contact[I][“Mobile”]”。最后,我选择了为DataThankyu Reblochon传递文本,这看起来很有希望,我会测试一下,让你知道,它成功了,非常感谢我确实怀疑“lambda”可能会以某种方式用于此,但之前我只使用它来更改按钮本身的文本,因为它是全局的,如果您只是将索引传递给函数,而不是使用复杂的lambda
语句,那么代码将更易于调试和维护。同意,这是一个很好的建议,谢谢@BrianOakley。我在回答中添加了一个内容。@BryanOakley有趣的是,就在今天登录之前,我刚刚完成了程序,并尝试了添加其他标签(移动/地址)的确切方法,尽管我在让函数能够访问字典方面遇到了问题(它产生了一个错误),这使我假设无法从函数中访问词典,但这可能是我自己的格式错误,因为我的“按钮创建代码”与您的不同,我在文本“参数”中使用了与“传递”类似的方法“num=contact[I][“Mobile”]”。最后,我选择了为数据传递文本