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