#python #if-statement #events #combobox #pysimplegui
Вопрос:
Поэтому я пытаюсь сделать так, чтобы поля со списком в моем графическом интерфейсе обновлялись, когда пользователь вводит данные. Эта часть проста, и это не проблема. Проблема в том, что когда пользователь вводит выбор в другое поле, он игнорирует ограничения, установленные предыдущим полем. Позвольте мне показать вам.
На этом изображении показано, что есть только один вариант, когда ввод типа является необратимым, который является правильным и каким он должен быть. Однако, если я изменю одно из других полей, я получу это изображение:
Как вы можете видеть на этом втором изображении, в поле со списком «Поворот» установлено значение «Необратимый» И «Обратимый», что неверно. Это должно оставаться просто Необратимым.
Вот фрагмент моего кода.
if event == 'type': if v['board'] == 'Select Option': board_op.clear() if v['volt'] == 'Select Option': volt_op.clear() if v['rot'] == 'Select Option': rot_op.clear() if v['start'] == 'Select Option': start_op.clear() if v['overl'] == 'Select Option': overl_op.clear() if v['lead'] == 'Select Option': lead_op.clear() if v['switch'] == 'Select Option': switch_op.clear() i = 0 while i lt; len(workbook): if workbook['Type:'][i] == v['type']: if v['board'] == 'Select Option': board_op.append(workbook['Board:'][i]) if v['volt'] == 'Select Option': volt_op.append(workbook['Voltage:'][i]) if v['rot'] == 'Select Option': rot_op.append(workbook['Rotation:'][i]) if v['start'] == 'Select Option': start_op.append(workbook['Start:'][i]) if v['overl'] == 'Select Option': overl_op.append(workbook['Overload:'][i]) if v['lead'] == 'Select Option': lead_op.append(workbook['Lead:'][i]) if v['switch'] == 'Select Option': switch_op.append(workbook['Switch:'][i]) i = 1 if v['board'] == 'Select Option': board_op = list(dict.fromkeys(board_op)) if v['volt'] == 'Select Option': volt_op = list(dict.fromkeys(volt_op)) if v['rot'] == 'Select Option': rot_op = list(dict.fromkeys(rot_op)) if v['start'] == 'Select Option': start_op = list(dict.fromkeys(start_op)) if v['overl'] == 'Select Option': overl_op = list(dict.fromkeys(overl_op)) if v['lead'] == 'Select Option': lead_op = list(dict.fromkeys(lead_op)) if v['switch'] == 'Select Option': switch_op = list(dict.fromkeys(switch_op)) if v['board'] == 'Select Option': win['board'].update(value='Select Option', values=board_op) if v['volt'] == 'Select Option': win['volt'].update(value='Select Option', values=volt_op) if v['rot'] == 'Select Option': win['rot'].update(value='Select Option', values=rot_op) if v['start'] == 'Select Option': win['start'].update(value='Select Option', values=start_op) if v['overl'] == 'Select Option': win['overl'].update(value='Select Option', values=overl_op) if v['lead'] == 'Select Option': win['lead'].update(value='Select Option', values=lead_op) if v['switch'] == 'Select Option': win['switch'].update(value='Select Option', values=switch_op) if event == 'board': if v['type'] == 'Select Option': type_op.clear() if v['volt'] == 'Select Option': volt_op.clear() if v['rot'] == 'Select Option': rot_op.clear() if v['start'] == 'Select Option': start_op.clear() if v['overl'] == 'Select Option': overl_op.clear() if v['lead'] == 'Select Option': lead_op.clear() if v['switch'] == 'Select Option': switch_op.clear() i = 0 while i lt; len(workbook): if workbook['Board:'][i] == v['board']: if v['type'] == 'Select Option': type_op.append(workbook['Type:'][i]) if v['volt'] == 'Select Option': volt_op.append(workbook['Voltage:'][i]) if v['rot'] == 'Select Option': rot_op.append(workbook['Rotation:'][i]) if v['start'] == 'Select Option': start_op.append(workbook['Start:'][i]) if v['overl'] == 'Select Option': overl_op.append(workbook['Overload:'][i]) if v['lead'] == 'Select Option': lead_op.append(workbook['Lead:'][i]) if v['switch'] == 'Select Option': switch_op.append(workbook['Switch:'][i]) i = 1 if v['type'] == 'Select Option': type_op = list(dict.fromkeys(type_op)) if v['volt'] == 'Select Option': volt_op = list(dict.fromkeys(volt_op)) if v['rot'] == 'Select Option': rot_op = list(dict.fromkeys(rot_op)) if v['start'] == 'Select Option': start_op = list(dict.fromkeys(start_op)) if v['overl'] == 'Select Option': overl_op = list(dict.fromkeys(overl_op)) if v['lead'] == 'Select Option': lead_op = list(dict.fromkeys(lead_op)) if v['switch'] == 'Select Option': switch_op = list(dict.fromkeys(switch_op)) if v['type'] == 'Select Option': win['type'].update(value='Select Option', values=type_op) if v['volt'] == 'Select Option': win['volt'].update(value='Select Option', values=volt_op) if v['rot'] == 'Select Option': win['rot'].update(value='Select Option', values=rot_op) if v['start'] == 'Select Option': win['start'].update(value='Select Option', values=start_op) if v['overl'] == 'Select Option': win['overl'].update(value='Select Option', values=overl_op) if v['lead'] == 'Select Option': win['lead'].update(value='Select Option', values=lead_op) if v['switch'] == 'Select Option': win['switch'].update(value='Select Option', values=switch_op)
Это всего лишь фрагмент, он продолжается для каждого из моих входов.
Итак, вот в чем дело, я знаю, в чем причина проблемы. Проблема вызвана строкой кода, в которой говорится
if v['rot'] == 'Select Option':
Первоначальная цель этой строки состояла в том, чтобы убедиться, что если пользователь введет выбор в поле со списком, то он не изменит ввод. Что отлично справляется с этой работой, но в случае, как я показал выше, поскольку ввод оставался «Опцией выбора», он счел нужным продолжить и изменить параметры комбинирования, несмотря на то, что они были определены моим предыдущим вводом. Он просто игнорирует предыдущие входные данные. Так что я знаю, в чем моя проблема, но не знаю, как ее исправить.
Комментарии:
1. У вас так много одинаковых строковых литералов, например
'Select Option'
. Я действительно думаю, что это может привести к множеству потенциальных ошибок; было бы намного проще хранить такие строки в переменной, поэтому вам нужно изменить их только в одном месте, и вы никогда ничего не испортите из-за опечатки.2. Вы правы, что у меня много одинаковых строк, и они могут вызвать проблемы. Я пытаюсь найти способ сократить это, однако я не верю, что они являются причиной проблемы. Я проверил их, и наличие такого количества из них не должно быть причиной, по крайней мере, этой проблемы.
3. Я понимаю, я не говорил, что это ваша проблема, но просто указывал, как это создает хрупкость и ненужную избыточность.
4. О, ты определенно. Это, безусловно, что-то в коде, что нужно изменить, и я работаю над этим. Но мне нужно сначала решить эту другую проблему, прежде чем я смогу беспокоиться об оптимизации.