简体   繁体   English

保存OptionMenu输入-tkinter

[英]Saving a OptionMenu input - tkinter

I adapted a simple example from the internet to create a simple drop-down menu. 我从互联网上改编了一个简单的示例,以创建一个简单的下拉菜单。 I am trying to user's input so that it can be used once they've closed the input box. 我正在尝试用户的输入,以便在他们关闭输入框后就可以使用它。 My latest attempt is shown below: 我的最新尝试如下所示:

from tkinter import *

root = Tk()
root.title("Tk dropdown example")

# Add a grid
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 = 100, padx = 100)

# Create a Tkinter variable
tkvar1 = StringVar(root)
tkvar2 = StringVar(root)

choices_wl = [2,3,4]

popupMenu = OptionMenu(mainframe, tkvar1, *choices_wl)
Label(mainframe, text="Select a number").grid(row = 1, column = 1)
popupMenu.grid(row = 2, column =1)

choices_rw = [5,10,15,20]


popupMenu = OptionMenu(mainframe, tkvar2, *choices_rw)
Label(mainframe, text="Select a width").grid(row = 1, column = 2)
popupMenu.grid(row = 2, column =2)

quit_button = Button(mainframe, text="OK", command=root.destroy).grid(row = 5, column = 2)

# on change dropdown value
def change_dropdown1(*args):
    number=tkvar1.get()
    tkvar1.set(number)
    return number

def change_dropdown2(*args):
    print( tkvar2.get() )

# link function to change dropdown
tkvar1.trace('w', change_dropdown1)
number = change_dropdown1()
tkvar2.trace('w', change_dropdown2)

root.mainloop()

print("number=%s" % number)

This doesn't work and all that's printed is 'number=' 这不起作用,并且所有打印的内容都是'number ='

Any advice would be appreciated 任何意见,将不胜感激

I think you are making things far too complicated. 我认为您使事情变得太复杂了。 Your tkvar variables are tracking all on their own so you only need to print the value of each tkvar after the mainloop has ended. 您的tkvar变量会全部跟踪自己,因此您只需在mainloop结束后打印每个tkvar的值即可。

Removed the 2 functions and just used the tkvars. 删除了2个函数,只使用了tkvars。

from tkinter import *

root = Tk()
root.title("Tk dropdown example")

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=100, padx=100)

tkvar1 = StringVar(root)
tkvar2 = StringVar(root)

choices_wl = [2, 3, 4]
choices_rw = [5, 10, 15, 20]

popupMenu = OptionMenu(mainframe, tkvar1, *choices_wl)
Label(mainframe, text="Select a number").grid(row=1, column=1)
popupMenu.grid(row=2, column=1)

popupMenu = OptionMenu(mainframe, tkvar2, *choices_rw)
Label(mainframe, text="Select a width").grid(row=1, column=2)
popupMenu.grid(row=2, column=2)

quit_button = Button(mainframe, text="OK", command=root.destroy).grid(row=5, column=2)

root.mainloop()

# this line works fine on my end.
print("numbers = {}, {}".format(tkvar1.get(), tkvar2.get()))

Though I feel like this print statement should not work because we destroy the tkinter instance and I assumed that should also destroy the tkvar's but I guess not. 虽然我觉得这个打印语句不应该工作,因为我们销毁了tkinter实例,并且我认为那也应该销毁了tkvar的实例,但我想不是。 Maybe someone could shed some light on this for me. 也许有人可以帮我了解一下。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM