В настоящее время я пытаюсь написать функцию, которая выполняет следующее:
- Принимает все сообщения из списка 'сообщений' в случайном порядке, следя за тем, чтобы ни одно из них не повторялось.
- Печатает их после случайной задержки в секундах в диапазоне от 1 до 10 секунд.
- После завершения всех нитей выводится строка «Печать завершена.быть возвращены в главное меню через 5 секунд. "
Проблема, с которой я сталкиваюсь, заключается в том, что строка" Печать завершена ... "печатается между случайными сообщениями,а не после них.
Моя путаница проистекает из того факта, что метод .join () отлично работает для аналогичной функции.Строка печатается только после завершения всех потоков.Основное различие между ними заключается в том, что другая функция не принимает произвольный ввод.Вместо этого он перебирает глобальный словарь 'messages_and_times', в котором пары ключ: значение поступают из пользовательских вводов для сообщения и количества секунд (пользовательский ввод обрабатывается еще одной функцией).
Ниже выможно увидеть функцию option_3 (), которая не работает, и функцию option_2 (), которая работает.В самом низу я приведу весь код для дальнейшего использования.
Может кто-нибудь помочь мне понять, что я делаю неправильно?
Заранее спасибо за ваше время и помощь.
PS Функция clear()
предназначена для очистки дисплея терминала после каждого входа.
Неработающая функция:
def option_3():
clear()
messages = ["message_1", "message_2", "message_3", "message_4", "message_5",
"message_6", "message_7", "message_8", "message_9", "message_10"]
print("Printing initialized:\n")
def threading_function(message, seconds):
time.sleep(seconds)
print(message)
for message in messages:
randomized_messages = []
random_index = random.randint(0, len(messages) - 1)
randomized_messages.append(messages.pop(random_index))
for msg in randomized_messages:
t = Thread(target=threading_function, args=(msg, random.choice(range(1,11))))
t.start()
t.join()
time.sleep(0.5)
print(
"\nPrinting is finished. You will be returned to the main menu in 5 seconds.")
time.sleep(5)
main_menu()
Рабочая функция:
def option_2():
global messages_and_times
clear()
print("Printing initialized:\n")
def threading_function(message, seconds):
time.sleep(seconds)
print(message)
for message, seconds in messages_and_times.items():
t = Thread(target=threading_function, args=(message, seconds))
t.start()
t.join()
time.sleep(0.5)
print(
"\nPrinting is finished. You will be returned to the main menu in 5 seconds.")
time.sleep(5)
main_menu()
Вся функция main_menu ():
import os
import random
clear = lambda: os.system('cls')
messages_and_times = {}
def main_menu():
def option_1():
global messages_and_times
clear()
message = input(
"Please type in a message you would like to add to the list:")
clear()
seconds = int(
input("Please type in the time of delay for this message:"))
messages_and_times[message] = seconds
def create_dictionary():
clear()
answer = input(
"Would you like to add another message? (yes/no)").lower()
if answer == "yes":
option_1()
elif answer == "no":
clear()
print("You will now be returned to the main menu.")
time.sleep(1.5)
main_menu()
else:
clear()
print("Please answer yes or no.")
time.sleep(1.5)
create_dictionary()
create_dictionary()
def option_2():
global messages_and_times
clear()
print("Printing initialized:\n")
def threading_function(message, seconds):
time.sleep(seconds)
print(message)
for message, seconds in messages_and_times.items():
t = Thread(target=threading_function, args=(message, seconds))
t.start()
t.join()
time.sleep(0.5)
print(
"\nPrinting is finished. You will be returned to the main menu in 5 seconds.")
time.sleep(5)
main_menu()
def option_3():
clear()
messages = ["message_1", "message_2", "message_3", "message_4", "message_5",
"message_6", "message_7", "message_8", "message_9", "message_10"]
randomized_messages = []
print("Printing initialized:\n")
def threading_function(message, seconds):
time.sleep(seconds)
print(message)
for message in messages:
random_index = random.randint(0, len(messages) - 1)
randomized_messages.append(messages.pop(random_index))
for msg in randomized_messages:
t = Thread(target=threading_function, args=(msg, random.choice(range(1,11))))
t.start()
t.join()
time.sleep(0.5)
print(
"\nPrinting is finished. You will be returned to the main menu in 5 seconds.")
time.sleep(5)
main_menu()
clear()
selection = 0
while selection == 0:
print(("-" * 15) + "MAIN MENU" + ("-" * 15) + "\n")
print("1: Input a message and a corresponding time of delay before its display.")
print("2: Print your customized list of messages.")
print("3: Print random messages with random delays.\n")
selection = int(input(
"Please select one of the options, by typing in the corresponding number:"))
if selection == 1:
option_1()
elif selection == 2:
option_2()
elif selection == 3:
option_3()
else:
clear()
print("Please select from options 1 - 3.\n")
time.sleep(1.5)
main_menu()
Edit (окончательные решения для дальнейшего использования):
Благодаря предложениям от Almog David,Вот как я изменил свои функции, чтобы они работали как задумано.Я надеюсь, что это поможет кому-нибудь в будущем найти решение.
Option_2 ():
def option_2():
global messages_and_times
clear()
threads = []
print("Printing initialized:\n")
def threading_function(message, seconds):
time.sleep(seconds)
print(message)
for message, seconds in messages_and_times.items():
t = Thread(target=threading_function, args=(message, seconds))
t.start()
threads.append(t)
for t in threads:
t.join()
time.sleep(0.5)
print(
"\nPrinting is finished. You will be returned to the main menu in 5 seconds.")
time.sleep(5)
main_menu()
Option_3 ():
def option_3():
clear()
messages = ["message_1", "message_2", "message_3", "message_4", "message_5",
"message_6", "message_7", "message_8", "message_9", "message_10"]
threads = []
print("Printing initialized:\n")
def threading_function(message, seconds):
time.sleep(seconds)
print(message)
for message in messages:
t = Thread(target=threading_function, args=(
message, random.choice(range(1, 11))))
t.start()
threads.append(t)
for t in threads:
t.join()
time.sleep(0.5)
print(
"\nPrinting is finished. You will be returned to the main menu in 5 seconds.")
time.sleep(5)
main_menu()