Как стать автором
Обновить

Как создать генератор паролей а также генератор фигур на Python

Уровень сложностиСредний

Всем пользователям Хабра, привет. Сегодня мы будем создавать генератор паролей, и генератор фигур на Python, с использованием модулей random, tkinter и его расширение.

Генератор паролей

Для создания программы нужно сначала импортировать модули tkinter, random и tkinter.ttk:

import tkinter
import random
import tkinter.ttk
  • Модуль tkinter - отвечает за графический интерфейс.

  • Модуль random - логично что отвечает за рандом.

  • Модуль tkinter.ttk - расширение tkinter, которое я буду использовать только один раз в нашем приложении, ради красивой кнопки.

Далее создать холст с размером "750х500" и цветом фона "grey11" а потом запаковываем, и запускаем основной цикл игры, подробнее о цветах:

window = tkinter.Tk()
canvas = tkinter.Canvas(window, width=750, height=500, bg="grey11")
canvas.pack()

#Тут будем писать код дальше

window.mainloop()
  • tkinter.Tk() - отвечает за создание окна.

  • window - отвечает за расположение холста в окне, особенно это полезно когда окно не одно, а их два.

  • width и height - отвечают за ширину и высоту окна.

  • bg (сокращенние от background) - отвечает за фон окна.

  • <имя холста>.pack() - отвечает за расположение холста.

  • <имя окна>.mainloop() - отвечает за пуск программы

Далее нужно сделать тексты на вверху генератора, будем использовать для этого виджет "Label":

text = tkinter.Label(canvas,
                     text="Генератор",
                     bg="grey11",
                     foreground="white",
                     font=("bold script", 35, "bold"))
text_2 = tkinter.Label(canvas,
                       text="Паролей",
                       bg="grey11",
                       foreground="white",
                       font=("bold script", 35, "bold"))
  • Виджет Label - отвечает за текст в окне.

  • canvas - отвечает за расположение на холсте

  • text=' ' - отвечает за содержание текста.

  • bg=' ' - отвечает за фон текста.

  • foreground=' ' - отвечает за цвет текста.

  • font=(' ', int, ' ') - первый аргумент: отвечает за шрифт текста, второй аргумент: отвечает за размер текста, третий аргумент: отвечает за жирноту текста.

И распологаем их в окне:

text.place(x=270, y=30)
text_2.place(x=287, y=100)
  • Метод place() - отвечает за расположение объекта. Также есть ещё два метода: ".pack()" и ".grid()".

  • x и y - отвечают естественно за положение x и y объекта.

Теперь создаём небольшой дизайн нашего приложения, с помощью функции canvas.create_rectangle() в tkinter. Причём этот объект не нужно распологать в окне:

small_menu = canvas.create_rectangle(50, 450, 700, 180, fill="grey95")
  • <имя холста>.create_rectangle() - создание квадрата на холсте canvas.

  • (a, b, c, d) - a: левый край, b: верхний край, c: правый край, d: нижний край.

  • fill=' ' - цвет заполнения.

Далее создадим и расположим, кнопки-виджеты "Checkbutton", с уже встроенными мной проверками нажатий ("offvalue" и "onvalue"):

cbtn = tkinter.Checkbutton(canvas,
                           text="0-9",
                           variable=cbtn_variable,
                           offvalue=False,
                           onvalue=True)
cbtn.place(x=60, y=350)

cbtn2 = tkinter.Checkbutton(canvas,
                            text="a-z",
                            variable=cbtn2_variable,
                            offvalue=False,
                            onvalue=True)
cbtn2.place(x=120, y=350)

cbtn3 = tkinter.Checkbutton(canvas,
                            text="A-Z",
                            variable=cbtn3_variable,
                            offvalue=False,
                            onvalue=True)
cbtn3.place(x=180, y=350)

cbtn4 = tkinter.Checkbutton(canvas,
                            text="$@&?",
                            variable=cbtn4_variable,
                            offvalue=False,
                            onvalue=True)
cbtn4.place(x=240, y=350)

cbtn5 = tkinter.Checkbutton(canvas,
                            text="+-*/",
                            variable=cbtn5_variable,
                            offvalue=False,
                            onvalue=True)
cbtn5.place(x=305, y=350)

cbtn6 = tkinter.Checkbutton(canvas,
                            text="%=;№!",
                            variable=cbtn6_variable,
                            offvalue=False,
                            onvalue=True)
cbtn6.place(x=370, y=350)

cbtn7 = tkinter.Checkbutton(canvas,
                            text="_^,.",
                            variable=cbtn7_variable,
                            offvalue=False,
                            onvalue=True)
cbtn7.place(x=435, y=350)
  • Виджет Checkbutton - кнопка возле которой можно поставить галочку.

  • canvas - расположение на холсте canvas.

  • text=' ' - текст слева от кнопки.

  • variable=<название переменной> - связывает нажатие с переменной которую мы добавим в следующем кусочке кода.

  • offvalue и onvalue - даёт команду если кнопка выключена и соотвественно если включена.

Теперь сделаем обработчик значений этих кнопок (желательно перед созданием всех кнопок):

cbtn_variable = tkinter.BooleanVar()
cbtn2_variable = tkinter.BooleanVar()
cbtn3_variable = tkinter.BooleanVar()
cbtn4_variable = tkinter.BooleanVar()
cbtn5_variable = tkinter.BooleanVar()
cbtn6_variable = tkinter.BooleanVar()
cbtn7_variable = tkinter.BooleanVar()
  • tkinter.BooleanVar() - принимает значения bool из других переменных.

Теперь нужно создать поля ввода, с помощью виджета "Entry":

entry = tkinter.Entry(canvas, width=2)
entry.place(x=80, y=300)

entry_2 = tkinter.Entry(canvas,
                        width=50,
                        justify=tkinter.RIGHT,
                        font=("Arial", 15, "bold"))
entry_2.place(x=100, y=250)
  • Виджет Entry - поле ввода в которое можно вводить пользователю любое значение, а потом можно его собирать или что-нибудь туда вставить.

  • canvas - размещение на холсте canvas.

  • width=int - ширина поля ввода.

  • justify=tkinter.RIGHT - отображать текст справа

  • font=(' ', int, ' ') - первый аргумент: шрифт текста, второй аргумент: размер текста, третий аргумент: жирность текста.

А теперь создадим кнопку с помощью модуля tkinter.ttk, и дадим команду при нажатии:

btn = tkinter.ttk.Button(canvas,
                         text="Сгенерировать пароль",
                         width=50,
                         command=generate)
btn.place(x=200, y=300)
  • Виджет ttk.Button - создаёт нормальную кнопку.

  • canvas - размещение на холсте canvas.

  • text=' ' - текст кнопки.

  • width=int - ширина кнопки.

  • command=generate - при нажатии кнопки переходить в функцию generate.

Теперь создаём списки практически в самом начале программы (после canvas.pack):

d = []
d2 = []
d3 = []
d4 = []
d5 = []
d6 = []
d7 = []

Далее создаём функцию generate, вызываем глобальные переменные, и удаляем весь текст поле ввода "entry":

def generate():
    global d
    global d2
    global d3
    global d4
    global d5
    global d6
    global d7
    entry_2.delete(0,tkinter.END)
  • Метод delete() - удаляет объект, или в нашем случае удаляет удаляет текст из виджета Entry.

  • (int, end) - первый аргумент: с какого символа начинать, в нашем коде с первого, второй аргумент: каким символом заканчивать.

Теперь сохраним значение в переменной "entry_2" (количество символов):

    a = int(entry.get())

Создаём переменную "h" которая будет равна количеству символов в поле ввода и минус 2, ну и потом мы возьмём и удалим все символы до h (это нужно если число будет трёхзначным или больше):

    h = len(f"{a}")
    h = h - 2
    entry.delete(0,h)
  • Функция len() - узнаёт количество символов в строке.

  • (f"{a}") - передаётся значение символов в поле ввода (в строчном значении, так как в числовом не принимается).

  • .delete() - удаляет символы с начала до h.

Если значение поля ввода (количество символов) больше чем 40 то изменить это число на 40:

    if a > 40:
        entry.delete(0,tkinter.END)
        entry.insert(0,"40")
        a = int(entry.get())
  • .insert() - добавляет символы.

  • (int, str) - первый аргумент: где вставлять, второй аргумент: что вставить.

Забираем значения кнопок:

    b = cbtn_variable.get()
    b2 = cbtn2_variable.get()
    b3 = cbtn3_variable.get()
    b4 = cbtn4_variable.get()
    b5 = cbtn5_variable.get()
    b6 = cbtn6_variable.get()
    b7 = cbtn7_variable.get()

Теперь делаем проверку на нажатие или наоборот на не нажатие:

    if b == True:
        d = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    if b2 == True:
        d2 = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m",
              "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]
    if b3 == True:
        d3 = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M",
              "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]
    if b4 == True:
        d4 = ["$", "@", "&", "?"]
    if b5 == True:
        d5 = ["+", "-", "*", "/"]
    if b6 == True:
        d6 = ["%", "=", "!", "№"]
    if b7 == True:
        d7 = ["_", "^", ",", "."]
    if b == False:
        d.clear()
    if b2 == False:
        d2.clear()
    if b3 == False:
        d3.clear()
    if b4 == False:
        d4.clear()
    if b5 == False:
        d5.clear()
    if b6 == False:
        d6.clear()
    if b7 == False:
        d7.clear()
  • .clear() - удаляет все элементы списка.

Далее прибавим значения списков:

    d_all = d + d2 + d3 + d4 + d5 + d6 + d7

И наконец создаём цикл! В котором мы будем "a" количество раз, выбирать случайный элемент из списка с помощью функции random.choice(), и писать это в конец поля ввода:

    for x in range(a):
        c = random.choice(d_all)
        entry_2.insert(tkinter.END,c)
  • random.choice() - выбирает случайный элемент из списка.

Весь код:

import random
import tkinter
import tkinter.ttk

canvasWidth = 750
canvasHeight = 500
window = tkinter.Tk()
canvas = tkinter.Canvas(window, width=canvasWidth, height=canvasHeight, bg="grey11")
canvas.pack()

d = []
d2 = []
d3 = []
d4 = []
d5 = []
d6 = []
d7 = []


def generate():
    global d
    global d2
    global d3
    global d4
    global d5
    global d6
    global d7
    entry_2.delete(0,tkinter.END)
    a = int(entry.get())
    h = len(f"{a}")
    h = h - 2
    entry.delete(0,h)
    if a > 40:
        entry.delete(0,tkinter.END)
        entry.insert(0,"40")
        a = int(entry.get())
    b = cbtn_variable.get()
    b2 = cbtn2_variable.get()
    b3 = cbtn3_variable.get()
    b4 = cbtn4_variable.get()
    b5 = cbtn5_variable.get()
    b6 = cbtn6_variable.get()
    b7 = cbtn7_variable.get()
    if b == True:
        d = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    if b2 == True:
        d2 = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m",
              "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]
    if b3 == True:
        d3 = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M",
              "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]
    if b4 == True:
        d4 = ["$", "@", "&", "?"]
    if b5 == True:
        d5 = ["+", "-", "*", "/"]
    if b6 == True:
        d6 = ["%", "=", "!", "№"]
    if b7 == True:
        d7 = ["_", "^", ",", "."]
    if b == False:
        d.clear()
    if b2 == False:
        d2.clear()
    if b3 == False:
        d3.clear()
    if b4 == False:
        d4.clear()
    if b5 == False:
        d5.clear()
    if b6 == False:
        d6.clear()
    if b7 == False:
        d7.clear()
    d_all = d + d2 + d3 + d4 + d5 + d6 + d7
    for x in range(a):
        c = random.choice(d_all)
        entry_2.insert(tkinter.END,c)


cbtn_variable = tkinter.BooleanVar()
cbtn2_variable = tkinter.BooleanVar()
cbtn3_variable = tkinter.BooleanVar()
cbtn4_variable = tkinter.BooleanVar()
cbtn5_variable = tkinter.BooleanVar()
cbtn6_variable = tkinter.BooleanVar()
cbtn7_variable = tkinter.BooleanVar()

text = tkinter.Label(canvas,
                     text="Генератор",
                     bg="grey11",
                     foreground="white",
                     font=("bold script", 35, "bold"))
text.place(x=270, y=30)

text_2 = tkinter.Label(canvas,
                       text="Паролей",
                       bg="grey11",
                       foreground="white",
                       font=("bold script", 35, "bold"))
text_2.place(x=287, y=100)

cool = canvas.create_rectangle(50, 450, 700, 180, fill="grey95")

cbtn = tkinter.Checkbutton(canvas,
                           text="0-9",
                           variable=cbtn_variable,
                           offvalue=False,
                           onvalue=True)
cbtn.place(x=60, y=350)

cbtn2 = tkinter.Checkbutton(canvas,
                            text="a-z",
                            variable=cbtn2_variable,
                            offvalue=False,
                            onvalue=True)
cbtn2.place(x=120, y=350)

cbtn3 = tkinter.Checkbutton(canvas,
                            text="A-Z",
                            variable=cbtn3_variable,
                            offvalue=False,
                            onvalue=True)
cbtn3.place(x=180, y=350)

cbtn4 = tkinter.Checkbutton(canvas,
                            text="$@&?",
                            variable=cbtn4_variable,
                            offvalue=False, onvalue=True)
cbtn4.place(x=240, y=350)

cbtn5 = tkinter.Checkbutton(canvas,
                            text="+-*/",
                            variable=cbtn5_variable,
                            offvalue=False,
                            onvalue=True)
cbtn5.place(x=305, y=350)

cbtn6 = tkinter.Checkbutton(canvas,
                            text="%=№!",
                            variable=cbtn6_variable,
                            offvalue=False,
                            onvalue=True)
cbtn6.place(x=370, y=350)

cbtn7 = tkinter.Checkbutton(canvas,
                            text="_^,.",
                            variable=cbtn7_variable,
                            offvalue=False,
                            onvalue=True)
cbtn7.place(x=435, y=350)

btn = tkinter.ttk.Button(canvas,
                         text="Сгенерировать пароль",
                         width=50, command=generate)
btn.place(x=200, y=300)

entry = tkinter.Entry(canvas, width=2)
entry.place(x=80, y=300)

entry_2 = tkinter.Entry(canvas,
                        width=50,
                        justify=tkinter.RIGHT,
                        font=("Arial", 15, "bold"))
entry_2.place(x=100, y=250)


window.mainloop()

Генератор фигур (объяснение многих функций можете найти в разделе с генератором паролей)

Опять импортируем два модуля: tkinter и random:

import random
import tkinter

И создаём окно, холст, запаковываем его, и запускаем главный цикл:

window = tkinter.Tk()
canvas = tkinter.Canvas(window, width=750, height=500, bg="white")
canvas.pack()

#Тут будем писать код дальше

window.mainloop()

Теперь создаём функцию random.randint(int, end), которая выбирает рандомно целые числа в этом пределе:

a = random.randint(1, 101)
  • random.randint(int, end) - выбирает случайное целое число в радиусе от int до end (end не выбирается)

Теперь делаем список для хранения координат:

coords = [None] * 10

Далее мы должны сделать цикл с повторением "a" раз, то есть он повторяется от 1 до 101 раз:

for x in range(a):

А также уже в этом цикле создаём рандомное количество углов (от 1 до 11) и 4 дополнительные координаты:

    f = random.randint(1, 11)
    
    # Генерация дополнительных координат
    g = random.randint(1, 750)
    b = random.randint(1, 500)
    c = random.randint(1, 750)
    d = random.randint(1, 500)
    
    # Поворот координат
    points = [g, b, c, d]

Запускаем цикл который будет идти "f" раз (от 1 до 11) и только если количество углов будет больше чем 4:

    for y in range(f):
        if y < len(coords):
            coords[y] = random.randint(1, 750)  # Заполнение координат

Далее создаём список со всеми случайными значениями из прошлого цикла:

    # Фильтрация None и создание списка координат
    filtered_coords = [coord for coord in coords if coord is not None]

Делаем проверку на чётность, если нечётно то создать новую координату:

    if len(filtered_coords) % 2 == 1:
        filtered_coords.append(0)

И наконец создаём многоугольник с рандомными углами, и рандомным цветом:

    canvas.create_polygon(filtered_coords, fill=random.choice(["red",
                                                               "orange",
                                                               "yellow",
                                                               "green",
                                                               "blue",
                                                               "purple",
                                                               "black",
                                                               "white"]))

Весь код:

import random
import tkinter

window = tkinter.Tk()
canvas = tkinter.Canvas(window, width=750, height=500, bg="white")
canvas.pack()

a = random.randint(1, 101)

# Инициализация переменных
coords = [None] * 10  # Список для хранения координат

for x in range(a):
    f = random.randint(1, 11)
    
    # Генерация дополнительных координат
    g = random.randint(1, 750)
    b = random.randint(1, 500)
    c = random.randint(1, 750)
    d = random.randint(1, 500)
    
    # Поворот координат
    points = [g, b, c, d]

    for y in range(f):
        if y < len(coords):
            coords[y] = random.randint(1, 750)  # Заполнение координат

    # Фильтрация None и создание списка координат
    filtered_coords = [coord for coord in coords if coord is not None]

    if len(filtered_coords) % 2 == 1:
        filtered_coords.append(0)

    canvas.create_polygon(filtered_coords, fill=random.choice(["red",
                                                               "orange",
                                                               "yellow",
                                                               "green",
                                                               "blue",
                                                               "purple",
                                                               "black",
                                                               "white"]))

window.mainloop()

Выводы

После того как вы сделали эти генераторы вы точно заработали хоть небольшой опыт о модулях tkinter и random.

Я не претендую на авторские права, а поэтому вы можете эти программы использовать где угодно без страха перед авторскими правами.

Всем удачи, и пока!

Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.