Динамическое обновление нескольких полей со списком в проблемах с PySimpleGui

#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. О, ты определенно. Это, безусловно, что-то в коде, что нужно изменить, и я работаю над этим. Но мне нужно сначала решить эту другую проблему, прежде чем я смогу беспокоиться об оптимизации.