这是我试图做的简化版本。
import Tkinter as tk
root = tk.Tk()
n = 1
def show1():
print var.get()
def add1():
global n
l = 'Option %d' % n
n += 1
op['menu'].add_command(label=l,command=tk._setit(var,l))
var.set(l)
print 'added %s' % l
var = tk.StringVar()
op = tk.OptionMenu(root,var,[], command=show1)
op.pack()
tk.Button(root,text='add 1', command=add1).pack()
tk.Button(root,text='show', command=show1).pack()
root.mainloop()
“添加1”按钮成功地将选项添加到选项菜单。 单击某个选项不会调用show1例程,您必须单击“显示”按钮。
-------原始问题-----
我正在尝试阅读许多选定的文件并保存有关每个文件的信息。
当我在文件库中读取它们时,它存储在选项列表中。这似乎有效。
当我点击选项菜单中的选项时,我想显示保存的信息。那不行。
以下代码是在选项列表中添加名称,但您必须单击“获取”按钮才能显示数据。
#!/usr/bin/python2.7
import Tkinter as tk
import os,sys
import tkFileDialog as tkfd
class E(tk.Frame):
def __init__(self):
tk.Frame.__init__(self)
self.grid()
self.files = {}
self.statusMsg = tk.StringVar()
self.nLines = tk.StringVar()
self.maxLine = tk.StringVar()
self.fileName = tk.StringVar()
tk.Button(self,text='Get a file',command=self.openfile, bd=5).grid(row=1, column=0)
self.fileOption = tk.OptionMenu(self,self.fileName, [], command=self.getIt)
self.fileOption.configure(width=10, bd=5, relief='ridge')
self.fileOption.grid(row=2, column=0)
tk.Label(self,text='Line Count').grid(row=3, column=0)
tk.Label(self,textvariable=self.nLines).grid(row=3, column = 1)
tk.Label(self,text='Max Line').grid(row=4, column=0)
tk.Label(self,textvariable=self.maxLine).grid(row=4, column = 1)
tk.Button(self,text='show file',command=self.getIt, bd=5).grid(row=5)
tk.Label(self,text='Status').grid(row=6, column=0)
tk.Label(self,textvariable=self.statusMsg,width=20).grid(row=6, column = 1)
def openfile(self):
textFile = tkfd.askopenfile(mode='r', defaultextension='.txt',
filetypes=[("text","*.txt"),("All Files","*")],
initialdir='.')
(fileBaseName, fileExt) = os.path.splitext(os.path.basename(textFile.name))
maxLength = -1
lineCount = 0
for line in textFile:
lineCount += 1
maxLength = max(maxLength,len(line))
self.files[fileBaseName] = [maxLength,lineCount]
self.nLines.set(lineCount)
self.maxLine.set(maxLength)
self.statusMsg.set('Opened %s' % fileBaseName)
""" This works to add the file but the command is not
executed when selected in the optionmenu """
self.fileOption['menu'].add_command(label=fileBaseName, command=tk._setit(self.fileName,fileBaseName))
self.fileName.set(fileBaseName)
"""
fileList = sorted(self.files.keys())
for fname in fileList:
self.fileOption['menu'].add_command(label=fname, command=lambda v=fileList: self.getIt)
"""
"""
self.fileOption = tk.OptionMenu(self,self.fileName, fileList, command=self.getIt)
print fileList
"""
"""
self.fileOption['menu'].add_command(label=fileBaseName, command=tk._setit(self.fileName,fileBaseName))
self.fileOption.configure(command=self.getIt)
"""
"""
self.fileOption['menu'].add_command(label=fileBaseName, command=self.getIt)
"""
self.fileName.set(fileBaseName)
def getIt(self):
[maxLength,lineCount] = self.files[self.fileName.get()]
self.nLines.set(lineCount)
self.maxLine.set(maxLength)
self.statusMsg.set('got it')
if __name__ == "__main__":
app = E()
#app.title('Build Roof')
app.mainloop()
评论显示我尝试过的其他事情。
有很多例子可以在选项列表和其他设置命令的项目中添加项目,但没有一项能够同时执行这两项操作。
P.S。我想摆脱选项列表
中令人讨厌的第一个空白条目答案 0 :(得分:0)
解决方案结果非常简单。它适用于网格布局。只需留下OptionMenu需要去的空白区域,并将新条目附加到列表中。然后在添加条目时创建一个新的OptionMenu。
在您至少有一个条目之前,OptionMenu甚至不会出现。
import Tkinter as tk
root = tk.Tk()
n = 1
vars=[]
def show1(*entry):
print var.get()
def add1():
global n
l = 'Option %d' % n
n += 1
vars.append(l)
op = tk.OptionMenu(root,var,*vars, command=show1).grid(row=0, column=1)
var.set(l)
print 'added %s' % l
var = tk.StringVar()
root.grid()
tk.Button(root,text='add 1', command=add1).grid(row=0, column=0)
tk.Label(root,text=' ', width=12).grid(row=0,column=1)
如果你在网格中有足够的其他东西以保持空间开放,那么最后一行中的标签不需要在那里