Python Tkinter option要更新的菜单选项列表(选择后,应将该选项从选项中删除)

Python Tkinter option要更新的菜单选项列表(选择后,应将该选项从选项中删除),python,tkinter,Python,Tkinter,选项菜单有3个选项“a”、“b”、“c”。假设用户选择“b”作为第一个选项菜单。当他点击添加按钮时,第二个选项菜单应该只显示两个选项,因为他已经选择了选项“b” 我的代码显示这三个选项,与所选的选项无关。有什么出路吗 import tkinter from tkinter import * class Window(Frame): def __init__(self,master): Frame.__init__(self,master) self.mas

选项菜单有3个选项“a”、“b”、“c”。假设用户选择“b”作为第一个选项菜单。当他点击添加按钮时,第二个选项菜单应该只显示两个选项,因为他已经选择了选项“b”

我的代码显示这三个选项,与所选的选项无关。有什么出路吗

import tkinter
from tkinter import *
class Window(Frame):
    def __init__(self,master):
        Frame.__init__(self,master)
        self.master=master
        self.func()

def func(self):
    self.count=0
    self.op_row=0
    button=Button(self.master,text="Add",command= self.func_op)
    button.grid(column=0,row=0)
    label=Label(self,text="Welcome")
    label.grid(column=0,row=0)

    def func_op(self):
        self.count=self.count+1
        self.op_row=self.op_row+1
        self.var=StringVar()
        options=["a","b","c"]
        op=OptionMenu(self.master,self.var,*options)
        op.grid(column=0,row=self.op_row)

if __name__ == "__main__":
    root = Tk()
    aplication = Window(root)
    root.mainloop()   

这应该能奏效。现在
Name
菜单有3个元素
a、b、c
,如果按下
按钮
,所选元素将被“添加”(打印到控制台)并从列表中消失

import sys
if sys.version_info[0] >= 3:
    import tkinter as tk
else:
    import Tkinter as tk

class App(tk.Frame):


    def __init__(self, master):
        tk.Frame.__init__(self, master)
        self.dict = ['a','b','c']
        self.variable_a = tk.StringVar()
        self.optionmenu_a = tk.OptionMenu(self, self.variable_a, *self.dict)
        tk.Button(self, text="Add", command=self.func).pack()
        self.optionmenu_a.pack()
        self.pack()

    def func(self):
        menu = self.optionmenu_a["menu"]
        print self.variable_a.get() + " added"
        menu.delete(self.dict.index(self.variable_a.get()))



if __name__ == "__main__":
    root = tk.Tk()
    app = App(root)
    app.mainloop()
据我所知,你不能删除最后一个元素。但如果删除最后一个元素,则可以删除整个选项菜单


编辑:根据OPs注释进行编辑,并编辑代码

这应该可以做到。现在
Name
菜单有3个元素
a、b、c
,如果按下
按钮
,所选元素将被“添加”(打印到控制台)并从列表中消失

import sys
if sys.version_info[0] >= 3:
    import tkinter as tk
else:
    import Tkinter as tk

class App(tk.Frame):


    def __init__(self, master):
        tk.Frame.__init__(self, master)
        self.dict = ['a','b','c']
        self.variable_a = tk.StringVar()
        self.optionmenu_a = tk.OptionMenu(self, self.variable_a, *self.dict)
        tk.Button(self, text="Add", command=self.func).pack()
        self.optionmenu_a.pack()
        self.pack()

    def func(self):
        menu = self.optionmenu_a["menu"]
        print self.variable_a.get() + " added"
        menu.delete(self.dict.index(self.variable_a.get()))



if __name__ == "__main__":
    root = tk.Tk()
    app = App(root)
    app.mainloop()
据我所知,你不能删除最后一个元素。但如果删除最后一个元素,则可以删除整个选项菜单


编辑:根据OPs注释进行编辑,并编辑代码

选项菜单的设计目的不是在选择元素时将其删除。它是专门为显示所选项目而设计的

如果您想让用户从菜单中选择某个项目,然后从菜单中删除该项目,您应该只使用菜单按钮和菜单。这正是OptionMenu的功能,只是它有您明确不想使用的其他行为

下面是一个简单的例子:

import Tkinter as tk

class Example(tk.Frame):
    def __init__(self, parent):
        tk.Frame.__init__(self, parent)

        self.menubutton = tk.Menubutton(self, text="Pick an option", indicatoron=True, 
                                        borderwidth=1, relief="raised")
        self.menu = tk.Menu(self.menubutton, tearoff=False)
        self.menubutton.configure(menu=self.menu)
        for choice in ("a", "b", "c"):
            self.menu.add_command(label=choice, 
                                  command=lambda option=choice: self.set_option(option))

        self.text = tk.Text(self)
        self.menubutton.pack(side="top")
        self.text.pack(side="top", fill="both", expand=True)

    def set_option(self, option):
        self.text.insert("end", "you have chosen %s\n" % option)
        self.menu.delete(option)

if __name__ == "__main__":
    root = tk.Tk()
    Example(root).pack(fill="both", expand=True)
    root.mainloop()
您的用户可能会发现看到菜单中的项目消失是非常奇怪和令人困惑的。如果您的主要目标是简单地防止用户选择同一选项两次,那么您可以简单地在选择该选项后禁用该项,使用类似于以下的内容来代替delete语句:

self.menu.entryconfigure(option, state="disabled")

optionmenu的设计目的不是在选择元素时将其删除。它是专门为显示所选项目而设计的

如果您想让用户从菜单中选择某个项目,然后从菜单中删除该项目,您应该只使用菜单按钮和菜单。这正是OptionMenu的功能,只是它有您明确不想使用的其他行为

下面是一个简单的例子:

import Tkinter as tk

class Example(tk.Frame):
    def __init__(self, parent):
        tk.Frame.__init__(self, parent)

        self.menubutton = tk.Menubutton(self, text="Pick an option", indicatoron=True, 
                                        borderwidth=1, relief="raised")
        self.menu = tk.Menu(self.menubutton, tearoff=False)
        self.menubutton.configure(menu=self.menu)
        for choice in ("a", "b", "c"):
            self.menu.add_command(label=choice, 
                                  command=lambda option=choice: self.set_option(option))

        self.text = tk.Text(self)
        self.menubutton.pack(side="top")
        self.text.pack(side="top", fill="both", expand=True)

    def set_option(self, option):
        self.text.insert("end", "you have chosen %s\n" % option)
        self.menu.delete(option)

if __name__ == "__main__":
    root = tk.Tk()
    Example(root).pack(fill="both", expand=True)
    root.mainloop()
您的用户可能会发现看到菜单中的项目消失是非常奇怪和令人困惑的。如果您的主要目标是简单地防止用户选择同一选项两次,那么您可以简单地在选择该选项后禁用该项,使用类似于以下的内容来代替delete语句:

self.menu.entryconfigure(option, state="disabled")

如果删除用户选择的值,用户将如何知道他们选择了什么?这听起来似乎是非常混乱的使用选择一个值,并看到该值消失。当我选择了一个选项,下拉显示该选项。之后,我有一个添加按钮,添加了一个更多的选项菜单,我希望这些选项应该显示为['b','c',],因为我已经从可用性的角度选择了aFrom,听起来你应该使用常规菜单,而不是选项菜单。选项菜单用于选择一个值,并显示所选值。如果您不需要显示所选值,则无需使用optionmenu。请给我举个例子。据我所知,常规菜单无法解决这个问题。我不知道你的应用程序应该做什么才能给出一个好的答案,试图在评论中这样做是毫无意义的。选项菜单只是一个菜单按钮和一个菜单,所以它当然可以解决这个问题。您不需要OptionMenu的额外行为。你需要什么取决于很多因素。你真的在字母a、b和c之间挑三拣四吗?要挑选的项目列表真的只有三项吗?当他们从列表中选择某个内容时会发生什么情况,你真的只想删除它而不做任何其他事情吗?等等……如果删除用户选择的值,用户将如何知道他们选择了什么?这听起来似乎是非常混乱的使用选择一个值,并看到该值消失。当我选择了一个选项,下拉显示该选项。之后,我有一个添加按钮,添加了一个更多的选项菜单,我希望这些选项应该显示为['b','c',],因为我已经从可用性的角度选择了aFrom,听起来你应该使用常规菜单,而不是选项菜单。选项菜单用于选择一个值,并显示所选值。如果您不需要显示所选值,则无需使用optionmenu。请给我举个例子。据我所知,常规菜单无法解决这个问题。我不知道你的应用程序应该做什么才能给出一个好的答案,试图在评论中这样做是毫无意义的。选项菜单只是一个菜单按钮和一个菜单,所以它当然可以解决这个问题。您不需要OptionMenu的额外行为。你需要什么取决于很多因素。你真的在字母a、b和c之间挑三拣四吗?要挑选的项目列表真的只有三项吗?当他们从列表中选择某个内容时会发生什么情况,你真的只想删除它而不做任何其他事情吗?等等…谢谢你的回复,但我正在寻找一些不同的东西。我正在制作这个用户界面,用户可以从固定列表中选择选项。假设在第一个选项菜单中,他选择了b,因此当他单击add按钮时,他只能看到剩下的2个选项,因为b已经被选中。有什么办法吗?谢谢!但这仍然不是我想要的。我已经编辑了我的问题好了,我放弃了,我正在标记你的问题。下次花点时间直接问你的问题