Отображение всех результатов для простых чисел в одном всплывающем окне

Я пытаюсь создать генератор паролей на 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.")

Как я могу отобразить все результаты в одном всплывающем окне?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
77
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Вы должны хранить свои числа в 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.")

Плохой отступ для утверждений else: nums.append(num).

Jason Yang 09.07.2024 09:57

Вы можете объединить все простые числа, используя метод 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 может замедлить время отклика вашего графического интерфейса.

Другие вопросы по теме