我在python上做黑客已经有一段时间了,而不是一个真正的程序员,所以作为最后的手段,我在这里寻求帮助。我一整天都在谷歌上搜了一整天,但我似乎无法破解它。在
在这段从SE的示例中提取的代码中,注释掉的行
#self.Val2Txt = Tkinter.Entry(stepOne)
工作很好。但实际上我需要两个下拉列表。在
所以我在评论的下面加了几行
^{pr2}$当我运行脚本时,只要我触摸下拉列表,就会得到错误
AttributeError: 'str' object has no attribute 'set'
他们不接受选择
如果我点击提交按钮,我会得到错误
AttributeError: OptionMenu instance has no attribute 'get'
`。。。窗口仍然存在,而当按下submit时,原始窗口将退出窗口。在
我读到OptionMenu需要一个“command”,但我无法找到如何成功地做到这一点。这是代码,我希望它只是一些简单的东西我错过了/弄乱了。在
#!/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
条目小部件具有方法.get(),这就是它工作的原因。 但是,Optionmenu小部件的工作方式不同:它需要一个StringVar(),它保存所选的项。submit()方法中的.get()方法可以处理这些StringVars。在
在initialize()方法中声明两个StringVar:
然后将这些StringVars作为第二个参数添加到OptionMenus中:
^{pr2}$第二个参数之后的任何内容都被视为选择,所以不要显示这些消息(或在选择时过滤它们),只有选项(“选择播放列表”和“选择内容”是有效的选择选项)。在
在submit()方法中,获取StringVar的值:
我希望这有点帮助:-)
创建选项菜单时的第一个参数是父项。你说得对。第二个参数必须是一个特殊的tkinter变量(例如:
StringVar
)。此对象具有方法get
和set
。但是,你没有传入这些变量中的一个,而是传入了一个字符串。字符串没有这些消息,这就是为什么会出现您所说的错误。在更改菜单:
稍后,当需要该值时,可以对变量使用
^{pr2}$get
方法:有关选项菜单的详细信息,请参阅OptionMenu page on effbot。你也可以在“tkinter optionmenu”上搜索google或bing,你会发现很多与选项菜单相关的stackoverflow答案,以及指向其他讨论选项菜单的站点的链接。在
相关问题 更多 >
编程相关推荐