添加选项到python tkinter optionmenu并在选中时执行一个函数

时间:2018-04-12 16:12:55

标签: python tkinter optionmenu

这是我试图做的简化版本。

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。我想摆脱选项列表

中令人讨厌的第一个空白条目

1 个答案:

答案 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)

如果你在网格中有足够的其他东西以保持空间开放,那么最后一行中的标签不需要在那里