从字典中填充 wx.MenuItem 并将所有 MenuItems 绑定到相同的方法(传递字典值)?
Populate wx.MenuItem from a dictionary and Bind all MenuItems to the same Method (passing a dictionary value)?
使用 Python 3.x 和 wxPython.
我正在开发一个 GUI 工具,随着时间的推移可能需要对其进行扩展和更新,并且我正尝试在添加功能时减少工作量(长期)。
我有一个方法需要传递一个变量给它,然后该方法检查字典以查看哪个 "ID" 与它关联,然后使用该 ID 触发一些自动化。
job_dictionary = {
'job_name_in_english': 'id_goes_here',
'job_name_in_english': 'id_goes_here'
}
我有一个非常简单的 window 设置,我正在使用以下内容填充文件菜单:
for key in job_dictionary:
newitem = wx.MenuItem(file_menu,wx.ID_NEW, text = key,kind = wx.ITEM_NORMAL)
file_menu.Append(newitem)
稍后我想将它们绑定到一个方法,并向该方法传递 'key' 值,具体取决于它们 select 从菜单中选择的项目。
我 运行 遇到了一些困难。我想知道是否有一种方法可以根据字典中的键值动态绑定它们,因为一旦完成该部分,我就可以调用该方法并将键传递给它:
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
)
这将使变量名动态化,然后我想我可以在编写它们时绑定它们。所以我猜是这样的:
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...
如果您还需要键,那么您可以使用for key, value in a_dict.items():
并在循环外设置索引并手动增加它。
我错误地将文件菜单与下拉菜单混淆了。所以这是我的解决方案。
job_dictionary = {
'job_name1': 'job_id_1',
'job_name2': 'job_id_2'
}
制作 Window 和面板的代码在此处
#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)。然后我创建一个按钮,并将该按钮绑定到一个方法。
那么方法如下所示:
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])
以上方法获取选择编号,如果为空,会弹出错误信息提示您进行选择。如果它是一个已填充的选项,它将在该选项中查找字符串,并将其作为字典键值传递给另一个方法。
使用 Python 3.x 和 wxPython.
我正在开发一个 GUI 工具,随着时间的推移可能需要对其进行扩展和更新,并且我正尝试在添加功能时减少工作量(长期)。
我有一个方法需要传递一个变量给它,然后该方法检查字典以查看哪个 "ID" 与它关联,然后使用该 ID 触发一些自动化。
job_dictionary = {
'job_name_in_english': 'id_goes_here',
'job_name_in_english': 'id_goes_here'
}
我有一个非常简单的 window 设置,我正在使用以下内容填充文件菜单:
for key in job_dictionary:
newitem = wx.MenuItem(file_menu,wx.ID_NEW, text = key,kind = wx.ITEM_NORMAL)
file_menu.Append(newitem)
稍后我想将它们绑定到一个方法,并向该方法传递 'key' 值,具体取决于它们 select 从菜单中选择的项目。
我 运行 遇到了一些困难。我想知道是否有一种方法可以根据字典中的键值动态绑定它们,因为一旦完成该部分,我就可以调用该方法并将键传递给它:
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
)
这将使变量名动态化,然后我想我可以在编写它们时绑定它们。所以我猜是这样的:
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...
如果您还需要键,那么您可以使用for key, value in a_dict.items():
并在循环外设置索引并手动增加它。
我错误地将文件菜单与下拉菜单混淆了。所以这是我的解决方案。
job_dictionary = {
'job_name1': 'job_id_1',
'job_name2': 'job_id_2'
}
制作 Window 和面板的代码在此处
#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)。然后我创建一个按钮,并将该按钮绑定到一个方法。
那么方法如下所示:
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])
以上方法获取选择编号,如果为空,会弹出错误信息提示您进行选择。如果它是一个已填充的选项,它将在该选项中查找字符串,并将其作为字典键值传递给另一个方法。