Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从字典中填充wx.MenuItem并将所有MenuItem绑定到同一个方法(传递字典值)?_Python_Python 3.x_Dictionary_Variables_Wxpython - Fatal编程技术网

Python 从字典中填充wx.MenuItem并将所有MenuItem绑定到同一个方法(传递字典值)?

Python 从字典中填充wx.MenuItem并将所有MenuItem绑定到同一个方法(传递字典值)?,python,python-3.x,dictionary,variables,wxpython,Python,Python 3.x,Dictionary,Variables,Wxpython,使用Python3.x和wxPython 我正在开发一个GUI工具,该工具可能需要随着时间的推移进行扩展和更新,我正在尝试减少添加功能时的工作量(长期) 我有一个方法需要向其传递一个变量,然后该方法检查字典以查看哪个“ID”与之关联,然后使用该ID触发一些自动化 job_dictionary = { 'job_name_in_english': 'id_goes_here', 'job_name_in_english': 'id_goes_here' } 我有一个非常简单的窗口

使用Python3.x和wxPython

我正在开发一个GUI工具,该工具可能需要随着时间的推移进行扩展和更新,我正在尝试减少添加功能时的工作量(长期)

我有一个方法需要向其传递一个变量,然后该方法检查字典以查看哪个“ID”与之关联,然后使用该ID触发一些自动化

job_dictionary = {
    'job_name_in_english': 'id_goes_here',
    'job_name_in_english': 'id_goes_here'
}
我有一个非常简单的窗口设置,并用以下内容填充文件菜单:

for key in job_dictionary:
    newitem = wx.MenuItem(file_menu,wx.ID_NEW, text = key,kind = wx.ITEM_NORMAL)
    file_menu.Append(newitem)
然后,稍后我想将它们绑定到一个方法,并根据它们从菜单中选择的项目向该方法传递“key”值

这就是我遇到困难的地方。我想知道是否有一种方法可以根据字典中的键值动态绑定它们,因为一旦我完成了这一部分,我就可以调用该方法并将键传递给它:

def job_trigger(key)
    id = job_dictionary[key]
    #Rest Of Code...
希望我所做的一切都有意义。我对构建GUI应用程序还是新手,这是我第一次处理文件菜单,也是我第一次尝试实现类似的东西

我知道在批处理脚本中,我可以执行以下操作:

set x=0
loop of some kind here(
set /A "x=x+1"
set menuItem%x%=foobar
)
def execute_job(self, evt):
        choice = self.choice.GetSelection()
        if choice == -1:
            wx.MessageBox('Please Make a Selection from the DropDown.',
                          'Warning', wx.OK | wx.ICON_INFORMATION)
        else:
            key = self.choice.GetString(choice)
            jobTrigger(key, job_dictionary[key])
这将使变量名成为动态的,然后我想我可以在编写它们时绑定它们。所以我猜是这样的:

x = 0
for key in dictionary
     x += 1
     menu_item = 'menu_item_' + x
     'menu_item_' + x = wx.Menu().Append(wx.ID_FILEDLGG, key)
     'menu_item_' + x.Bind(wx.EVT_MENU, self.job_trigger(key), key)

我知道这不是这种情况下的正确语法,我不知道这是否是处理这种情况的适当方法,或者我是否应该尝试其他方法。

根据我的推断,您可能只需要对dict进行简单的迭代:

#! /usr/bin/env python3

a_dict = {
    "key_0": "value_0",
    "key_1": "value_1"
}

for i, v in enumerate(a_dict):
    print("current index: {}".format(i))
    print("current value: {}".format(v))

    # string manipulation
    builder_string = "prefix_" + str(i)
    print(builder_string)

    # rest of code...

如果您还需要键,那么您可以使用
作为键,在一个dict.items()中使用值:
并在循环外设置索引并手动递增。

我错误地将文件菜单与下拉菜单混淆了。这就是我的解决方案

job_dictionary = {
    'job_name1': 'job_id_1',
    'job_name2': 'job_id_2'
}
用于制作窗口和面板的代码位于此处

#Create Dropdown Menu
jobs = list()
for i in job_dictionary.keys():
    jobs.append(i)
self.choice = wx.Choice(panel, pos=(5,5), size=(375,50), choices = jobs)
#Create Buttons
trigger_job_btn = wx.Button(panel, label='Trigger Job', pos=(290,50))
#Button Trigger
trigger_job_btn.Bind(wx.EVT_BUTTON, self.execute_job)
上面的代码从字典中创建一个列表,然后使用该列表填充下拉菜单(wx.Choice)。然后我创建一个按钮,并将该按钮绑定到一个方法

然后该方法如下所示:

set x=0
loop of some kind here(
set /A "x=x+1"
set menuItem%x%=foobar
)
def execute_job(self, evt):
        choice = self.choice.GetSelection()
        if choice == -1:
            wx.MessageBox('Please Make a Selection from the DropDown.',
                          'Warning', wx.OK | wx.ICON_INFORMATION)
        else:
            key = self.choice.GetString(choice)
            jobTrigger(key, job_dictionary[key])

上面的方法获取选项号,如果为空,则会弹出一条错误消息,通知您进行选择。如果它是一个填充的选项,它将在该选项中查找字符串,并将其作为字典键值传递给另一个方法。

您计划如何实现最终的函数?您会编写它们,创建处理它们的类,还是做一些不同的事情?您还可以将函数直接绑定到dict中,这样就可以返回函数。函数已经编写好了,最终它将使用Operations Orchestration API触发作业流。这是一个非常简单的函数,实际上,它只需要一个作业id,它触发作业,然后监视状态,它不返回任何值,只是用作业运行的当前状态更新状态栏。这些类型的自动快捷方式旨在简化,在当时似乎是个好主意,但它们很少长期工作。如果您将负责项目生命周期的更新,则可能没问题。然而,如果其他人必须维护/更新它,情况可能并非如此。您还必须假设您的简化方法能够适应未来的所有需求。这似乎是一种痛苦,但如果其他人将来不得不保持这种状态,显式编码比隐式编码更好。只是一种观点,但基于经验。:)在字符串操作中,这不只是将其设置为(在您的示例中)“prefix\u key\u 0”但保留“builder\u string”的名称吗?我要做的是将文件菜单中的项目绑定到同一个方法,为文件菜单中列出的每个项目向方法传递不同的键。这就是我不真正理解“环境”的地方。你们从哪里得到这个方法,你们的键(字典)是什么?对不起,我不理解wx,我更习惯于Tkinter用python构建GUI。顺便说一句,看看,试着做一个最简单的例子。我找到了一种方法,用下拉菜单,我试着用文件菜单,我想我在读东西的时候把我的话弄乱了。但我已经弄明白了,很快就会在这里发布我的答案。