【问题标题】:Tkinter Option Menu Variable.get() method not returning selected elementTkinter Option Menu Variable.get() 方法不返回所选元素
【发布时间】:2019-12-17 21:32:11
【问题描述】:

我在使用 Tkinter 时遇到了一些问题,我想在按下按钮时检索选项菜单的选定项,但是在使用小测试函数“getdataset”测试功能时,我只得到预定义的数据变量(“Birthdata”)作为输出,因此 datavariable.get() 方法似乎没有返回选项菜单中的选定选项。我到处寻找,但似乎找不到答案。任何帮助表示赞赏。

带有选项菜单的代码

root = Tk()
root.configure(background='white')
def getdataset():
    print(datavariable.get())

datavariable = StringVar(root)
datavariable.set('Birthdata')
PickData = OptionMenu(root, datavariable,'Birthdata', 'Marriagedata', 'Deathdata',command=getdataset)
PickData.grid(column=1,columnspan=2,row=1)

点击按钮初始化测试函数的代码:

wordcloud = Button(root, text = 'Word Cloud', bg='white', width=20, height = 5, command=getdataset)

点击多个按钮后的输出:

Birthdata
Birthdata
Birthdata

我想

【问题讨论】:

  • 你可能会抛出一个错误。更具体地说TypeError: getdataset() takes 0 positional arguments but 1 was given。将getdataset(): 更改为getdataset(_=None):,如果有帮助,请告诉我。
  • 你应该得到一个错误,这个错误会告诉你哪里出了问题。如果我们用明显的代码填充缺失的部分,发布的代码会出错。如果您没有收到错误,请edit 您的问题包括正确的minimal reproducible example。
  • @Mike-SMT 我试过了,但它仍然只打印预定义的变量
  • @BryanOakley 不...我没有任何错误,这使得它很奇怪且难以解决
  • 您一定会遇到错误,除非您使用的是非标准的OptionMenu。回调需要一个参数,而您的回调不接受一个参数。但是,即使出现错误,您的代码对我来说也能正常工作——当我单击按钮时,它总是显示选定的值。

标签: python python-3.x tkinter optionmenu tkinter.optionmenu


【解决方案1】:

从 OptionMenu 中选择选项时应该会出错。

具体来说:

TypeError: getdataset() takes 0 positional arguments but 1 was given

为了解决这个问题,我们可以添加一个参数来处理这个问题。将您的函数更新为如下所示:

def getdataset(_=None):

这是因为您的 2 个不同的 commands 与此函数交互的方式。 OptionMenu 命令在没有 Button 命令的情况下调用时向函数发送参数。起初这并不明显,但是如果您编写如下内容:

def getdataset(arg=None):
    print(arg)

您会看到,当您按下按钮时,它将打印None,当您从菜单中选择某些内容时,它将打印选择的值。

您的代码应如下所示:

import tkinter as tk


def getdataset(_=None):
    print(datavariable.get())


root = tk.Tk()
root.configure(background='white')
datavariable = tk.StringVar(root)
datavariable.set('Birthdata')
tk.OptionMenu(root, datavariable, 'Birthdata', 'Marriagedata', 'Deathdata', command=getdataset).grid()
tk.Button(root, text='Word Cloud', bg='white', width=20, height=5, command=getdataset).grid()
root.mainloop()

【讨论】:

  • 是的,这就是我的代码现在的样子,它仍然只打印“出生数据”。我添加了 '_=None' 参数,但它并没有改变任何东西。
  • 您能否添加您的代码截图。我知道它对问题的不好做法,但我需要看看某处是否存在不匹配。或添加图片链接。
  • 所以我重新启动了一切,它现在正在工作。无论如何感谢您的帮助!
猜你喜欢
  • 2018-10-19
  • 1970-01-01
  • 2020-03-16
  • 1970-01-01
  • 1970-01-01
  • 2014-11-25
  • 1970-01-01
  • 2018-10-15
  • 2015-08-29
相关资源
最近更新 更多