Я пытаюсь создать генератор паролей на Python. Я начал с написания программы для генерации простых чисел, которые будут использоваться при расчете RSA, и нашел программу, которую модифицировал для отображения результатов во всплывающих окнах через PySimpleGUI. Однако у меня возникли проблемы с отображением всех результатов в одном всплывающем окне.
Вот мой код:
import PySimpleGUI as sg
start = int(sg.popup_get_text("Enter the start of the range: " ))
end = int(sg.popup_get_text("Enter the end of the range: "))
for num in range(start, end + 1):
if num > 1:
for i in range(2, int(num**0.5) + 1):
if (num % i) == 0:
break
else:
sg.popup(num)
sg.popup("The process is complete. Press OK to close.")
Как я могу отобразить все результаты в одном всплывающем окне?
Вы должны хранить свои числа в 1 переменной. Например, вы можете использовать список:
result = []
for num in range(start, end + 1):
if num > 1:
for i in range(2, int(num**0.5) + 1):
if (num % i) == 0:
break
else:
result.append(num)
sg.popup(f'Numbers are: {result}')
Ваш код как есть создает всплывающее окно один раз за итерацию цикла for. Вот почему для каждого номера создается новое всплывающее окно; каждый раз, когда он достигает следующего простого числа, ему приходится открывать новое всплывающее окно с нуля.
Если вы хотите, чтобы все номера отображались в одном всплывающем окне, вам нужно вызвать sg.popup
ровно один раз после завершения всего цикла. Это требует того или иного сохранения ваших простых чисел, пока вы выполняете вычисления; список, вероятно, лучший выбор.
Ваш существующий код с небольшими изменениями выполнит свою работу:
import PySimpleGUI as sg
start = int(sg.popup_get_text("Enter the start of the range: " ))
end = int(sg.popup_get_text("Enter the end of the range: "))
primes = [] # Intialize an empty list; we'll fill this with primes later
for num in range(start, end + 1):
if num > 1:
for i in range(2, int(num**0.5) + 1):
if (num % i) == 0:
break
else:
primes.append(str(num)) # Instead of creating a popup immediately, add it to the list
sg.popup(" ".join(primes)) # Now join all the primes with spaces and create one combined popup
sg.popup("The process is complete. Press OK to close.")
Вы создаете всплывающее окно для каждого простого числа. Вместо этого создайте список и добавьте в него все простые числа, а затем отобразите список в одном всплывающем окне.
import PySimpleGUI as sg
start = int(sg.popup_get_text("Enter the start of the range: " ))
end = int(sg.popup_get_text("Enter the end of the range: "))
nums = []
for num in range(start, end, 1):
if num > 1:
for i in range(2, int(num**0.5) + 1):
if (num % i == 0):
break
else:
nums.append(num)
sg.popup(nums)
sg.popup("The process is complete. Press OK to close.")
Вы можете объединить все простые числа, используя метод str.join
, а затем передать его в качестве аргумента sg.popup
, например
import PySimpleGUI as sg
nums = [f"{i}" for i in range(100)]
message = ", ".join(nums)
sg.popup(message, title = "Prime Number")
Это может плохо сработать, если сообщение слишком длинное и не помещается на экране.
Вы можете использовать некоторые элементы с полосой прокрутки, чтобы показать больше, например sg.Multiline
.
Программирование для графического интерфейса, работа не как в консоли, а обработка всех пользовательских событий в графическом интерфейсе.
Пример кода
import PySimpleGUI as sg
sg.theme("DarkBlue")
sg.set_options(font=("Courier New", 16))
layout_left = [
[sg.Multiline("", disabled=True, size=(40, 10), pad=(0, 0), expand_x=True, key = "RESULT")],
]
layout_right = [
[sg.VPush()],
[sg.Text("Fm"), sg.Input(size=10, key = "FM", focus=True)],
[sg.Text("To"), sg.Input(size=10, key='TO')],
[sg.Text("", expand_x=True, justification='center', key = "MESSAGE")],
[sg.VPush()],
[sg.Button("Search", expand_x=True)],
]
layout = [[sg.Column(layout_left), sg.Column(layout_right, expand_y=True)]]
window = sg.Window("Prime Number", layout, margins=(0, 0))
while True:
event, values = window.read()
if event in (sg.WIN_CLOSED, "Exit"):
break
elif event == "Search":
window["MESSAGE"].update("")
try:
start, stop = int(values["FM"]), int(values["TO"])
except ValueError:
window["MESSAGE"].update("<Bad Number>")
continue
primes = []
for num in range(start, stop + 1):
if num > 1:
for i in range(2, int(num**0.5) + 1):
if (num % i) == 0:
break
else:
primes.append(str(num))
window["RESULT"].update(", ".join(primes))
window.close()
Примечание. Увеличение количества содержимого элемента sg.Multiline
может замедлить время отклика вашего графического интерфейса.
Плохой отступ для утверждений
else: nums.append(num)
.