Python 2.7 焦点继续返回到所选的第一个选项菜单

Python 2.7 焦点继续返回到所选的第一个选项菜单,python-2.7,tkinter,Python 2.7,Tkinter,我正在编写一个应用程序,它有多个OptionMenu实例,我无法在它们之间正确地遍历焦点。这是一个由两部分组成的问题 首先,我最初的问题是,一旦您从其中一个菜单中选择了一个项目,每次您在不同的菜单中进行选择时,焦点总是会返回到该菜单。因此,如果您在菜单1中选择了一个选项,然后切换到菜单2并在那里进行选择,那么下一个选项卡将带您返回菜单1而不是菜单3。我用函数menu\u MacGyver()解决了这个问题,但我想要一个更优雅的解决方案 其次,“修复”代码仍然有一个bug。即使焦点现在遍历所有三个

我正在编写一个应用程序,它有多个
OptionMenu
实例,我无法在它们之间正确地遍历焦点。这是一个由两部分组成的问题

首先,我最初的问题是,一旦您从其中一个菜单中选择了一个项目,每次您在不同的菜单中进行选择时,焦点总是会返回到该菜单。因此,如果您在菜单1中选择了一个选项,然后切换到菜单2并在那里进行选择,那么下一个选项卡将带您返回菜单1而不是菜单3。我用函数
menu\u MacGyver()
解决了这个问题,但我想要一个更优雅的解决方案

其次,“修复”代码仍然有一个bug。即使焦点现在遍历所有三个菜单,当其他菜单中的任何一个下拉时,选择的第一个菜单仍然会显示一个突出显示(好像它在焦点中)。我甚至不知道程序是如何记住首先选择了哪个
选项菜单的,所以我无法让它忘记

下面是代码的问题部分:

    class MyApp:
        def __init__(self, parent):
            self.parent = parent
            self.mainFrame = Frame(parent, padx=10, pady=10)
            self.mainFrame.pack(side=TOP, anchor=CENTER)

            parent.bind_class("Menubutton", "<Down>",
                              lambda event: self.menu_MacGyver(event))

            self.report_format = StringVar()
            self.report_format.set("Non-spreadsheet overload report")
            self.base_case_rating = StringVar()
            self.base_case_rating.set("Rate B")
            self.contingency_rating = StringVar()
            self.contingency_rating.set("Rate B")

            self.report_format_options_str = ["Spreadsheet overload report",
                                              "Spreadsheet loading table",
                                              "Available capacity table",
                                              "Non-spreadsheet overload report",
                                              "Non-spreadsheet loading table",
                                              "Non-converged network",
                                              "Non-spreadsheet corrective actions"]
            option1 = OptionMenu(self.mainFrame,
                                 self.report_format,
                                 *self.report_format_options_str)
            option1.config(takefocus=1)
            option1.pack(side=TOP, anchor=NW)

            self.rating_options_str = ["Rate A", "Rate B", "Rate C"]
            option2 = OptionMenu(self.mainFrame,
                                 self.base_case_rating,
                                 *self.rating_options_str)
            option2.config(takefocus=1)
            option2.pack(side=TOP, anchor=NW)

            option3 = OptionMenu(self.mainFrame,
                                 self.contingency_rating,
                                 *self.rating_options_str)
            option3.config(takefocus=1)
            option3.pack(side=BOTTOM, anchor=NW)

        def menu_MacGyver(self, event):
            event.widget.event_generate("<space>")
            event.widget.config(takefocus=0)
            event.widget.focus_set()
            event.widget.config(takefocus=1)

    root = Tk()
    GUI = MyApp(root)
    root.mainloop()
类MyApp:
定义初始化(自身,父级):
self.parent=parent
self.mainFrame=Frame(父级,padx=10,pady=10)
self.mainFrame.pack(侧=顶部,锚=中心)
parent.bind_类(“菜单按钮”),“”,
lambda事件:self.menu_MacGyver(事件))
self.report_format=StringVar()
self.report\u format.set(“非电子表格重载报告”)
self.base\u case\u rating=StringVar()
自基本案例评级集(“评级B”)
self.contractive_rating=StringVar()
自应急_评级集(“评级B”)
self.report_format_options_str=[“电子表格重载报告”,
“电子表格加载表”,
“可用容量表”,
“非电子表格过载报告”,
“非电子表格加载表”,
“非融合网络”,
“非电子表格纠正措施”]
option1=OptionMenu(自选主机,
self.report_格式,
*自我报告(格式选项)
option1.config(takefocus=1)
选项1.组件(侧=顶部,锚=西北)
自我评级选项\u str=[“评级A”、“评级B”、“评级C”]
option2=OptionMenu(自选主机,
自我基本情况评级,
*自我评级(选项)
option2.config(takefocus=1)
选项2.组件(侧=顶部,锚=西北)
option3=OptionMenu(自选主机,
自我评估,
*自我评级(选项)
option3.config(takefocus=1)
选项3.组件(侧=底部,锚=西北)
def菜单_MacGyver(自身、事件):
event.widget.event\u generate(“”)
event.widget.config(takefocus=0)
event.widget.focus\u set()
event.widget.config(takefocus=1)
root=Tk()
GUI=MyApp(根目录)
root.mainloop()

什么平台?在我的linux机器上,它似乎工作得很好,即使我删除了你的“MacGuyver”绑定。组件之间的切换工作与我预期的完全一样。我使用的是Windows 7。我在mac上测试了它,在没有
MacGuyver
的情况下也遇到了同样的问题,但使用它,选项菜单在打开另一个菜单之前似乎一直处于选中状态,但焦点确实正确循环。@Tadhg
MacGyver
是在黑暗中拍摄的,因为我还不清楚是什么导致了这个问题。因为我不是唯一一个看到这种奇怪行为的人,我不认为我的安装有问题。无论如何,我重新安装了Python 2.7.9,但它没有改变任何东西。这不是对我最初问题的回答,但我确实通过将
选项菜单
替换为
组合框
,为自己解决了问题<代码>组合框
的表现和外观都要好得多。我不愿意做出改变,只是因为我的应用程序是一个PSS/E插件。要使用组合框,我必须导入ttk,但是PSS/E 32附带的Python 2.5中没有ttk。无论如何,这意味着我的应用程序只与PSS/E 33或更高版本兼容。