在Python中从Tkinter OptionMenu获取一个值

5

我试图打印出选项菜单中选择的值,但每次运行代码时只会打印出第一个值,即使我更改了我的选择为b或c。不确定我在哪里出错了。这是我的代码:

from tkinter import *
window=Tk()
window.geometry("700x400")

options=StringVar(window)
options.set("a")
menu=OptionMenu(window,options, "a","b","c")
menu.grid(row=2,column=2)
selection=options.get()
print(selection)
4个回答

5

可以使用OptionMenucommand选项,而不是跟踪变量。每次单击菜单项时,都会调用该命令。该命令接受一个参数:所选的项目。

import tkinter as tk

def callback(selection):
    print(selection)

root = tk.Tk()
options = tk.StringVar()
menu = tk.OptionMenu(root, options, 'a', 'b', 'c', command=callback)
menu.pack()
options.set('a')
root.mainloop()

在这种情况下,初始选定的项目未被打印,因为用户尚未单击它。如果您需要options.set('a')来触发回调,则必须像mentalita的答案中那样跟踪变量。

0

你在用户有机会更改所选选项之前就进行了选择的分配。

将其放入一个函数中,在按下“保存”按钮时调用该函数可能是最简单的修复方法。您还可以使用递归循环实时更新它,但这不是一个干净的解决方案。

我假设您已经在实际脚本中包含了root.mainloop()。


0
首先,您需要在代码末尾调用Tk的 mainloop。此外,请尝试跟踪options类变量。
文档中得知:您可以使用trace方法将“观察者”回调附加到变量上。每当内容更改时,都会调用回调。
import tkinter as tk

root = tk.Tk()
options = tk.StringVar()
options.trace_add('write', lambda *args: print(options.get()))
menu = tk.OptionMenu(root, options, 'a', 'b', 'c')
menu.pack()
options.set('a')
root.mainloop()

好的。"w"代表什么?我还不太熟悉Python,所以在很多问题上遇到了困难。 - West
@West:它代表“写”。我已经更新了我的答案,包括来自文档的简短解释。 - adder
谢谢。有没有办法获取所选的值并将其放入一个变量中,以便我可以在任何地方使用它? - West
我不知道你使用的是哪个版本的Python,但在Python 3.6中,trace已经弃用,应该使用options.trace_add('write', lambda *args: print(options.get()))代替。 - j_4321
@j_4321:TIL。谢谢你提醒我。 - adder

-1

试一下这个

import tkinter
window=tkinter.Tk()
window.geometry("700x400")

option_Menu = tkinter.StringVar(window)
options = ("a","b","c")
menu = tkinter.OptionMenu(window,option_Menu,*options)
menu.grid(row=2,column=2)
option_Menu.set(2)
selection=option_Menu.get()

print(selection)

tkinter.mainloop()

2
虽然这段代码可能解决了 OP 的问题,但强烈建议您提供有关为什么和/或如何回答问题的其他上下文。仅提供代码答案通常在长期内变得无用,因为未来遇到类似问题的观众无法理解解决方案背后的推理。 - E. Zeytinci

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接