python/GUI创建:如何将标签的文本重新配置为';匹配所单击按钮的文本';

python/GUI创建:如何将标签的文本重新配置为';匹配所单击按钮的文本';,python,python-3.x,tkinter,Python,Python 3.x,Tkinter,我已经浏览了关于标签/按钮/配置的多篇相关文章,到目前为止还没有找到任何解释这个确切问题的文章。我以前成功地编写了基本标签配置程序(使用“函数”和“命令=”以及“lambda”等),但它们只涉及使用设置字符串(text=“string”)的函数中的配置代码。 我打算在这个程序中做的是将标签文本更改为“按钮”中相同文本的文本,因此当用户单击按钮时,标签将显示带有附带字符串的文本(“联系人信息:”+按钮已单击) 我确信问题在于我的“功能代码”本身(尤其是行的后半部分的格式),下面的“for循环”中的

我已经浏览了关于标签/按钮/配置的多篇相关文章,到目前为止还没有找到任何解释这个确切问题的文章。我以前成功地编写了基本标签配置程序(使用“函数”和“命令=”以及“lambda”等),但它们只涉及使用设置字符串(text=“string”)的函数中的配置代码。 我打算在这个程序中做的是将标签文本更改为“按钮”中相同文本的文本,因此当用户单击按钮时,标签将显示带有附带字符串的文本(“联系人信息:”+按钮已单击)

我确信问题在于我的“功能代码”本身(尤其是行的后半部分的格式),下面的“for循环”中的“button creation”行或“button creation”行可能需要编辑(或者两者都需要编辑)

我猜有不止一条途径可以实现这一点,考虑到所有的“按钮文本”都作为键(名称)包含在字典中,因此任何类型的建议,无论哪种方式,都将受到极大的赞赏,我是Python新手,所以我确信这对于有经验的程序员来说都是一个简单易行的问题

# 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”]”。最后,我选择了为数据传递文本