Заполнить wx.MenuItem из словаря и привязать все MenuItems к одному и тому же методу (передав значение словаря)? - PullRequest
0 голосов
/ 18 января 2020

Использование Python 3.x и wx Python.

Я работаю над инструментом GUI, который, вероятно, потребуется со временем расширять и обновлять, и я пытаюсь уменьшить объем работы (долгосрочный) по мере добавления функций.

У меня есть метод, которому нужна переданная ему переменная, а затем метод проверяет словарь, чтобы увидеть, с каким «идентификатором» связан этот элемент, затем использует этот идентификатор для запуска некоторой автоматизации.

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)

Затем позже я хочу привязать их к методу и передать этому методу значение «ключ», в зависимости от того, какой элемент они выбирают из меню.

Именно здесь я сталкиваюсь с некоторыми трудностями. Мне было интересно, есть ли способ связать их динамически на основе значения ключа в словаре, потому что, как только я завершу эту часть, я могу просто вызвать метод и передать ему ключ:

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
)

, что сделает имя переменной динамическим c, и тогда я подумал, что могу связать их, когда они пишутся. Так что я думаю, что-то вроде:

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)

Я знаю, что это неправильный синтаксис для чего-то подобного, и я понятия не имею, будет ли это подходящим способом для обработки этого сценария, или если есть что-то еще полностью я должен пытаться.

Ответы [ 2 ]

0 голосов
/ 21 января 2020

Я по ошибке перепутал меню «Файл» с выпадающим меню. Итак, вот мое решение.

job_dictionary = {
    'job_name1': 'job_id_1',
    'job_name2': 'job_id_2'
}

Код для создания Window и Panel идет сюда

#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])

Приведенный выше метод получает номер выбора, если он пуст, вы получаете всплывающее сообщение об ошибке, сообщающее вам сделать выбор. Если это заполненный выбор, он будет искать строку в этом выборе и передавать ее другому методу в качестве значения ключа словаря.

0 голосов
/ 18 января 2020

Из того, что я вычел, вам может понадобиться только простая итерация над 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(): и установить индекс вне l oop и увеличить его вручную.

...