我已经在python上学习了一段时间,而不是真正的程序员,所以作为最后的选择,我想在这里寻求帮助。这整天我一直在搜寻技巧,但我似乎无法破解。

在这段代码中(从SE的一个示例中提取),注释掉的行

#self.Val2Txt = Tkinter.Entry(stepOne)


工作很好。但是我实际上需要2个下拉菜单。

所以我在注释行下面添加了行,

self.Val1Txt = Tkinter.OptionMenu(stepOne, 'Choose a Playlist', 'a','b','c')


当我运行脚本时,只要触摸下拉菜单,我就会收到错误消息

AttributeError: 'str' object has no attribute 'set'


他们不接受选择

如果我点击了提交按钮,我会收到错误消息

AttributeError: OptionMenu instance has no attribute 'get'


... ...并且窗口仍然存在,而当按下Submit时,原始文件将退出该窗口。

我读到OptionMenu需要一个“命令”,但是我找不到如何成功做到这一点的方法。这是代码,我希望这只是我错过/弄乱的简单事情。

    #!/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

最佳答案

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

更改您的选项菜单,如下所示:

self.Val1Var = StringVar()
self.Val1Txt = Tkinter.OptionMenu(stepOne, self.Val1Var, 'Choose a Playlist', 'a','b','c')


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

self.val1=self.Val1Var.get()


有关OptionMenu的更多信息,请参见OptionMenu page on effbot。您还可以在“ tkinter optionmenu”上进行google或bing搜索,并且会找到许多与Option菜单相关的stackoverflow答案,以及指向讨论Option菜单的其他站点的链接。

10-08 03:26