Я хочу показать пользователям другое поле ввода, но это не сработает, если я не сделаю это внутри цикла For для new_urlnew_url = input("Please enter new URL for a screenshot (press return to stop): ").strip(), но я хочу переместить поле ввода куда-нибудь за пределы цикла For, поэтому я попытался сделать это для поля ввода например new_url = new_url_input, возьмите переменную new_url_input и добавьте ее где-нибудь еще в моем коде, например new_url_input = input("Please enter new URL for a screenshot (press return to stop): ").strip(), но когда я это делаю, код отображается только один раз, но он должен работать так, как когда пользователь нажимает ввод, он показывает другое поле ввода. См. этот вопрос ответ для получения дополнительной информации о моей теме.
Оригинальный код:
# Load the data
file_name = file_name = path/to/json/file
with open(file_name) as fh:
full_data = json.load(fh)
# Dig into the data to find the screenshots
screen_shots = full_data['tabs'][0]['views'][1]['screenshots']
# Loop over each screen shot, updating each one
for number, screen_shot in enumerate(screen_shots):
new_url = input("Please enter new URL (press return to stop): ").strip()
if new_url:
screen_shot.update({"url": new_url, "fullSizeURL": new_url})
else:
break
# Remove all entries which we did not update
screen_shots = screen_shots[:number]
# Save the data
with open(file_name, 'w') as fh:
json.dump(full_data, fh, indent=4)
Пример того, как я хочу, чтобы это работало/выглядело:
new_url_input = input("Please enter new URL (press return to stop): ").strip()
# Load the data
file_name = path/to/json/file
with open(file_name) as fh:
full_data = json.load(fh)
# Dig into the data to find the screenshots
screen_shots = full_data['tabs'][0]['views'][1]['screenshots']
# Loop over each screen shot, updating each one
for number, screen_shot in enumerate(screen_shots):
new_url = new_url_input
if new_url:
screen_shot.update({"url": new_url, "fullSizeURL": new_url})
else:
break
# Remove all entries which we did not update
screen_shots = screen_shots[:number]
# Save the data
with open(file_name, 'w') as fh:
json.dump(full_data, fh, indent=4)






Когда вы вызываете input(), он возвращает строку, и в цикле вы просто присваиваете эту строку новой переменной. Вам нужно будет каким-то образом снова вызвать input(), даже если он обертывает его в функцию, например, используя lambda, как показано ниже...
new_url_input = lambda: input("Please enter new URL (press return to stop): ").strip()
# ...other code...
for number, screen_shot in enumerate(screen_shots):
new_url = new_url_input()
Обновлено: Теперь, когда я понимаю, что вы говорите (помогли инструкции по вводу), я думаю, это то, что вы пытаетесь сделать...
new_url_inputs = []
input_prompt = 'Please enter new URL (press return to stop): '
new_url_input = input(input_prompt).strip()
while new_url_input:
new_url_inputs.append(new_url_input)
new_url_input = input(input_prompt).strip()
# ...other code...
for number, screen_short in enumerate(screen_shots):
new_url = new_url_inputs[number]
# ...etc...
Это не сработает для меня, потому что я хочу сначала получить ввод, поэтому даже при этом размещении new_url_input где-то не выполняется, пока он не попадет в цикл For. Я хочу задать вопрос, получить ввод и использовать его позже в/для Для петли.
@Unknown Проверьте мое редактирование, я думаю, что это поможет.
Спасибо, но когда я запускаю его, я получаю эту ошибку new_url = new_url_inputs[number] IndexError: list index out of range
Поскольку у вас должно быть больше снимков экрана, чем введенных URL-адресов, поэтому поймайте исключение и обработайте его, как хотите.
Извините, я не понимаю, как с этим справиться, но все еще очень новичок в Python.
Я не знаю, что именно вы ищете. Но на основе динамического new_url_input. Вы можете использовать первую строку встроенного лямбда-метода внутри forloop. что-то вроде этого... new_url = get_new_url_input()