Pull to refresh

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

Level of difficultyMedium

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

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

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

Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.