首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Tkinter.OptionMenu未按预期工作

Tkinter.OptionMenu未按预期工作
EN

Stack Overflow用户
提问于 2015-09-23 12:02:30
回答 2查看 2.9K关注 0票数 2

我已经对python进行了一段时间的黑客攻击,而不是真正的程序员,所以作为最后的手段,我在这里请求帮助。我在谷歌上搜索了一整天,但我似乎无法破解它。

在这段代码中,从SE的一个示例中取消了注释行。

代码语言:javascript
复制
#self.Val2Txt = Tkinter.Entry(stepOne)

工作得很好。但实际上我需要两次跌落。

所以我在评论的下面加了几行,

代码语言:javascript
复制
self.Val1Txt = Tkinter.OptionMenu(stepOne, 'Choose a Playlist', 'a','b','c')

当我运行脚本时,我一碰到下拉列表,就会得到错误。

代码语言:javascript
复制
AttributeError: 'str' object has no attribute 'set'

他们不接受选择

如果我按下提交按钮,就会得到错误。

代码语言:javascript
复制
AttributeError: OptionMenu instance has no attribute 'get'

`` ..。并且该窗口仍然存在,而原始窗口在按下submit时会退出。

我读到OptionMenu需要一个“命令”,但我无法找到如何成功地做到这一点。这是代码,我希望它只是简单的东西,我错过了/搞砸了。

代码语言:javascript
复制
    #!/usr/bin/env python

import Tkinter
from Tkinter import *
import Tkinter, tkFileDialog

class Values(Tkinter.Tk):
    """docstring for Values"""
    def __init__(self, parent):
        Tkinter.Tk.__init__(self,parent)
        self.parent = parent
        self.initialize()

    def initialize(self):
        self.grid()
        stepOne = Tkinter.LabelFrame(self, text=" Choose A Playlist ")
        stepOne.grid(row=0, columnspan=7, sticky='W',padx=5, pady=5, ipadx=5, ipady=5)
        self.Val1Lbl = Tkinter.Label(stepOne,text="Playlist")
        self.Val1Lbl.grid(row=0, column=0, sticky='E', padx=10, pady=2)
        #self.Val1Txt = Tkinter.Entry(stepOne)        
        self.Val1Txt = Tkinter.OptionMenu(stepOne, 'Choose a Playlist', 'a','b','c')
        self.Val1Txt.grid(row=0, column=1, columnspan=4, pady=2, sticky='WE')
        self.Val2Lbl = Tkinter.Label(stepOne,text="Directory")
        self.Val2Lbl.grid(row=1, column=0, sticky='E', padx=10, pady=2)
        #self.Val2Txt = Tkinter.Entry(stepOne)
        self.Val2Txt = Tkinter.OptionMenu(stepOne, 'Select Something', 'd','e','f')
        self.Val2Txt.grid(row=1, column=1, columnspan=4, pady=2, sticky='WE')

        self.val1 = None
        self.val2 = None

        SubmitBtn = Tkinter.Button(stepOne, text="Submit",command=self.submit)
        SubmitBtn.grid(row=4, column=3, sticky='W', padx=5, pady=2)

    def submit(self):
        self.val1=self.Val1Txt.get()
        if self.val1=="":
            Win2=Tkinter.Tk()
            Win2.withdraw()

        self.val2=self.Val2Txt.get()
        if self.val2=="":
            Win2=Tkinter.Tk()
            Win2.withdraw()

        self.quit()


if __name__ == '__main__':
    app = Values(None)
    app.title('Values')
    app.mainloop() #this will run until it closes
    #Print the stuff you want.
    print app.val1,app.val2
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-09-23 12:46:39

创建选项菜单时的第一个参数是父参数。你说得对。第二个参数必须是一个特殊的tkinter变量(例如:StringVar)。该对象具有getset方法。但是,您不是要传入这些变量中的一个,而是传递一个字符串。字符串没有这些消息,这就是为什么您会得到您说的错误。

将选项菜单更改为如下所示:

代码语言:javascript
复制
self.Val1Var = StringVar()
self.Val1Txt = Tkinter.OptionMenu(stepOne, self.Val1Var, 'Choose a Playlist', 'a','b','c')

稍后,当您需要该值时,可以对变量使用get方法:

代码语言:javascript
复制
self.val1=self.Val1Var.get()

有关OptionMenu的更多信息,请参见关于effbot的OptionMenu页面。你也可以在"tkinter选项菜单“上搜索google或bing,你会发现很多与选项菜单相关的堆叠溢出答案,以及其他讨论选项菜单的网站的链接。

票数 2
EN

Stack Overflow用户

发布于 2015-09-23 12:48:33

入口小部件有.get()方法,这就是它工作的原因。但是,Optionmenu小部件的工作方式不同:它需要一个StringVar(),它保存所选的项。submit()方法中的.get()方法与这些StringVars一起工作。

在初始化()方法中声明两个StringVars:

代码语言:javascript
复制
self.s1, self.s2 = StringVar(), StringVar()

然后将这些StringVars作为第二个参数添加到OptionMenus中:

代码语言:javascript
复制
self.Val1Txt = Tkinter.OptionMenu(stepOne, self.s1, 'Choose a Playlist', 'a','b','c')
self.Val2Txt = Tkinter.OptionMenu(stepOne, self.s2, 'Select Something', 'd','e','f')

在第二个参数之后的任何内容都被认为是选择,所以不要显示消息(或者在被选中时筛选消息),只显示选项(“选择一个PlayList”和“选择某个东西”是有效的选择选项)。

在submit()方法中,获取StringVar的值:

代码语言:javascript
复制
self.val1 = self.s1.get()
self.val2 = self.s2.get()

我希望这能帮上忙:)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32739067

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档