#python #python-3.x #listbox #pysimplegui
Вопрос:
Когда я хочу получить индекс выбранного элемента в списке, а список пуст, я получаю сообщение об ошибке.
window['Listbox'].get_indexes()[0] ------------------------------------ IndexError: tuple index out of range
Исходный список, который я использую в своей программе, не пуст, но он меняется, поэтому он может быть пустым, и в этом случае, когда я нажимаю на поле списка, программа выходит из строя.
Код:
import PySimpleGUI as sg list1 = [] layout = [[sg.Listbox(list1, s=(13, 6), enable_events=True, key='Listbox')]] window = sg.Window("listbox test 1", layout=layout, size=(100, 100)) while True: event, values = window.read() if event == "Exit" or event == sg.WIN_CLOSED: break if event == 'Listbox': print(window['Listbox'].get_indexes()[0])
Может быть, есть простое решение для этого?
Если нет, то мне придется добавить проверку, пусто ли поле списка или нет.
Комментарии:
1. Почему ты звонишь мне? Значение находится в словаре значений. значения [«Список»] содержит выбранные в данный момент значения. если значения[‘Listbox’]: это все, что вам нужно проверить, нет ли записей. Пусть все будет просто.
2. Разве значения[‘Listbox’] не вернут мне строку? (Элемент из списка) Я ищу интекс.
3. хорошо, тогда вы можете посмотреть его на основе оригинальных вариантов или тоже можете использовать get. Более важный момент заключается в том, что, как правило, всегда проверяйте длину при выполнении индексации во что-либо.
Ответ №1:
Может ли это сработать в вашем случае?
if event == 'Listbox': try: print(window['Listbox'].get_indexes()[0]) except: print("Empty list")
Ответ №2:
Все, что требуется, — это оператор if.
if values['Listbox']: # if something was selected first_entry = values['Listbox'][0] window['Listbox'].get_indexes()[0] # if you want the index... it'll be safe because values says there are entries
Комментарии:
1. Если я попытаюсь: распечатать(значения[‘Listbox’][0]), когда список пуст, программа завершит работу, и я получу эту ошибку: ошибка индекса: индекс списка вне диапазона, так что это, к сожалению, не решает мою проблему.
2. Вот почему вы должны использовать оператор if, чтобы проверить, пусто ли оно. Первое утверждение, утверждение if, имеет важное значение и весь смысл объяснения. Это своего рода основная концепция. Попытка работает, потому что вы все равно получаете ошибку. В коде все еще есть ошибка. Попытка просто ловит его.
3. Хорошо, я попытался проверить, пусто ли поле списка, выполнив следующее: если значения[‘Listbox’][0] == «: Но я все равно получаю ошибку.
4. На самом деле, так и должно быть
if values['Listbox'] == []:
, и это то же самое, чтоif values['Listbox']:
. Если у вас есть список или кортеж, вы можете проиндексировать его, только если это не пустой список или пустой кортеж.[][0]
будет сделано исключениеIndexError: list index out of range
.5. Правдивость подойдет только
values['Listbox']
для того, если это недостаточно ясно, тогдаif len(values['Listbox']):
сделаем это. Более важный момент, проблема, проблема заключается в том, что [0] НИКОГДА не может быть выполнено, если сначала не будет добавлено «если» или какая-либо проверка.