【问题标题】:Assigning variables using choices in TKInter dropdown menu - Python 2.7使用 TKInter 下拉菜单中的选项分配变量 - Python 2.7
【发布时间】:2013-08-25 04:51:54
【问题描述】:

我希望能够创建一个下拉列表,并为列表中的每个选项分配一个不同的变量。从下拉列表中选择选项时,我想要一个输入框来显示关联的变量,而不是选项的名称。

在我的程序中,下拉列表包含人员列表。每个人都是不同的年龄。如何使用下拉菜单选择人员,然后在输入框中显示他们的年龄?

正如您在下面看到的,我以这种格式输入选项名称*年龄。我希望尝试按 * 拆分,然后选择年龄。我尝试使用以下方法指定输入框的文本: text = ((var.get()).split('*')[1]) 但这不起作用。

如果有办法实现这一点,请告诉我。

from Tkinter import *
import Tkinter as ttk 
from ttk import *

root = Tk()
root.title("Age Selector")

mainframe = Frame(root)                                 
mainframe.grid(column=0,row=0, sticky=(N,W,E,S) )
mainframe.columnconfigure(0, weight = 1)
mainframe.rowconfigure(0, weight = 1)
mainframe.pack(pady = 10, padx = 10)

var = StringVar(root)

var.set('Bob')

choices = ['Bob*35', 'Garry*45', 'John*32', 'Hank*65','Tyrone*21']

option = OptionMenu(mainframe, var, *choices)

option.grid(row = 1, column =1)

Label(mainframe, text="Age").grid(row = 2, column = 1)

age = StringVar()
age_ent = Entry(mainframe, text = var, width = 15).grid(column =      2, row = 2)

root.mainloop()

【问题讨论】:

    标签: python python-2.7 drop-down-menu tkinter


    【解决方案1】:

    试试下面的代码。阅读我添加的评论。

    from Tkinter import *
    import Tkinter as ttk 
    from ttk import *
    
    root = Tk()
    root.title("Age Selector")
    
    mainframe = Frame(root)                                 
    mainframe.grid(column=0,row=0, sticky=(N,W,E,S) )
    mainframe.columnconfigure(0, weight = 1)
    mainframe.rowconfigure(0, weight = 1)
    mainframe.pack(pady = 10, padx = 10)
    
    var = StringVar(root)
    
    # Use dictionary to map names to ages.
    choices = {
        'Bob': '35',
        'Garry': '45',
        'John': '32',
        'Hank': '64',
        'Tyrone': '21',
    }
    
    option = OptionMenu(mainframe, var, *choices)
    var.set('Bob')
    
    option.grid(row = 1, column =1)
    
    Label(mainframe, text="Age").grid(row = 2, column = 1)
    
    age = StringVar()
    # Bind age instead of var
    age_ent = Entry(mainframe, text=age, width = 15).grid(column = 2, row = 2)
    
    # change_age is called on var change.
    def change_age(*args):
        age_ = choices[var.get()]
        age.set(age_)
    # trace the change of var
    var.trace('w', change_age)
    
    root.mainloop()
    

    根据the documentation

    trace(mode, callback) => 字符串

    添加变量观察者。返回观察者的内部名称 (您可以使用它来取消注册观察者;见下文)。

    模式参数是“r”之一(读取变量时调用观察者 由某人)、“w”(当变量由某人编写时调用)或“u” (取消定义;删除变量时调用)。

    【讨论】:

    • 非常感谢,我是否也可以在下拉列表中显示不带 *age 的名称?我也不明白代码如何知道哪个部分是年龄,哪个部分是名称。如果您能解释一下,我将不胜感激。谢谢
    • @allankey,我更新了代码。使用字典来命名年龄。
    • 天才,非常感谢您的帮助!我只需要更改字典查找,因为不再需要拆分返回的值。
    • @allankey,我看到标记错了。我想我写了对错误答案的评论。我很抱歉。删除我之前的评论。
    猜你喜欢
    • 2017-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-18
    • 1970-01-01
    • 1970-01-01
    • 2012-07-18
    • 2012-12-08
    相关资源
    最近更新 更多