Проблема с Label в tkinter
Есть 2 окна: отправитель и получатель. Они нужны для реализации алгоритма шифрования RSA. Были созданы классы под генерацию простого числа и генерацию ключей, простые числа и открытый ключ надо вывести на экран. Почему-то так работает только в окне Sender
Весь код ниже
main.py
import threading
def start_sender():
from sender import Sender
sender = Sender()
sender.mainloop()
def start_receiver():
from reciever import Reciever
receiver = Reciever()
receiver.mainloop()
if __name__ == "__main__":
thread_sender = threading.Thread(target=start_sender)
thread_receiver = threading.Thread(target=start_receiver)
thread_sender.start()
thread_receiver.start()
thread_sender.join()
thread_receiver.join()
sender.py
import tkinter as tk
from tkinter import ttk
from tkinter import font
import rsa_keygen as rk
class Sender(tk.Tk):
def __init__(self):
super().__init__()
self.title("Отправитель")
self.iconbitmap(True, "key_icon.ico")
self.my_keys = []
self.prime_q = tk.StringVar()
self.prime_p = tk.StringVar()
self.n_value = tk.StringVar()
self.openk_value = tk.StringVar()
self.foreign_ok_value = tk.StringVar()
self.foreign_n_value = tk.StringVar()
custom_font = font.Font(size=12, weight="bold")
# Верхняя половина окна
top_frame = tk.Frame(self)
top_frame.pack(side=tk.TOP, pady=10)
# Правая часть окна для подписи
right_frame = tk.Frame(top_frame)
right_frame.pack(side=tk.LEFT)
rf_name = tk.Label(right_frame, text="Для подписи", font=custom_font)
rf_name.grid(pady=10, sticky="nw")
p_label = tk.Label(right_frame, text="P:")
p_label.grid(row=1, column=0, sticky="e")
self.p_entry = tk.Label(right_frame, textvariable=self.prime_p)
self.p_entry.grid(row=1, column=1, sticky="ew")
q_label = tk.Label(right_frame, text="Q:")
q_label.grid(row=2, column=0, sticky="e")
self.q_entry = tk.Label(right_frame, textvariable=self.prime_q)
self.q_entry.grid(row=2, column=1, sticky="ew")
pubkey_label = tk.Label(right_frame, text="Открытый ключ:")
pubkey_label.grid(row=3, column=0, sticky="e")
self.pubkey_entry = tk.Label(right_frame, textvariable=self.openk_value)
self.pubkey_entry.grid(row=3, column=1, sticky="ew")
n1_label = tk.Label(right_frame, text="N:")
n1_label.grid(row=4, column=0, sticky="e")
self.n1_entry = tk.Label(right_frame, textvariable=self.n_value)
self.n1_entry.grid(row=4, column=1, sticky="w")
# Линия разделения
separator = ttk.Separator(top_frame, orient=tk.VERTICAL)
separator.pack(side=tk.LEFT, padx=10)
# Левая часть окна для сообщения
left_frame = tk.Frame(top_frame)
left_frame.pack(side=tk.RIGHT)
lf_name = tk.Label(left_frame, text="Для сообщения", font=custom_font)
lf_name.grid(sticky="nw")
pubkey2_label = tk.Label(left_frame, text="Открытый ключ:")
pubkey2_label.grid(row=1, column=0, sticky="e")
self.pubkey2_entry = tk.Label(left_frame, textvariable=self.foreign_ok_value)
self.pubkey2_entry.grid(row=1, column=1, sticky="ew")
n2_label = tk.Label(left_frame, text="N:")
n2_label.grid(row=2, column=0, sticky="e")
self.n2_entry = tk.Label(left_frame, textvariable=self.foreign_n_value)
self.n2_entry.grid(row=2, column=1, sticky="ew")
# Кнопка подтверждения
formKeysButton = tk.Button(self, text="Сформировать ключи", command=self.formKeys)
formKeysButton.pack()
def formKeys(self):
rsaGen = rk.RSAKeygen()
p, q, n, e, d = rsaGen.generate_rsa_keys()
self.my_keys.append(e)
self.my_keys.append(d)
self.my_keys.append(n)
self.prime_p.set(p)
self.prime_q.set(q)
self.openk_value.set(e)
self.n_value.set(n)
reciever.py
import tkinter as tk
from tkinter import ttk
from tkinter import font
import rsa_keygen as rk
class Reciever(tk.Tk):
def __init__(self):
super().__init__()
self.title("Получатель")
self.iconbitmap(True, "key_icon.ico")
self.my_keys = []
self.prime_q = tk.StringVar()
self.prime_p = tk.StringVar()
self.n_value = tk.StringVar()
self.openk_value = tk.StringVar()
self.foreign_ok_value = tk.StringVar()
self.foreign_n_value = tk.StringVar()
custom_font = font.Font(size=12, weight="bold")
# Верхняя половина окна
top_frame = tk.Frame(self)
top_frame.pack(side=tk.TOP, pady=10)
# Правая часть окна для подписи
right_frame = tk.Frame(top_frame)
right_frame.pack(side=tk.LEFT)
rf_name = tk.Label(right_frame, text="Для сообщения", font=custom_font)
rf_name.grid(pady=10, sticky="nw")
p_label = tk.Label(right_frame, text="P:")
p_label.grid(row=1, column=0, sticky="e")
self.p_entry = tk.Label(right_frame, textvariable=self.prime_p)
self.p_entry.grid(row=1, column=1, sticky="ew")
q_label = tk.Label(right_frame, text="Q:")
q_label.grid(row=2, column=0, sticky="e")
self.q_entry = tk.Label(right_frame, textvariable=self.prime_q)
self.q_entry.grid(row=2, column=1, sticky="ew")
pubkey_label = tk.Label(right_frame, text="Открытый ключ:")
pubkey_label.grid(row=3, column=0, sticky="e")
self.pubkey_entry = tk.Label(right_frame, textvariable=self.openk_value)
self.pubkey_entry.grid(row=3, column=1, sticky="ew")
n1_label = tk.Label(right_frame, text="N:")
n1_label.grid(row=4, column=0, sticky="e")
self.n1_entry = tk.Label(right_frame, textvariable=self.n_value)
self.n1_entry.grid(row=4, column=1, sticky="w")
# Линия разделения
separator = ttk.Separator(top_frame, orient=tk.VERTICAL)
separator.pack(side=tk.LEFT, padx=10)
# Левая часть окна для сообщения
left_frame = tk.Frame(top_frame)
left_frame.pack(side=tk.RIGHT)
lf_name = tk.Label(left_frame, text="Для подписи", font=custom_font)
lf_name.grid(sticky="nw")
pubkey2_label = tk.Label(left_frame, text="Открытый ключ:")
pubkey2_label.grid(row=1, column=0, sticky="e")
self.pubkey2_entry = tk.Label(left_frame, textvariable=self.foreign_ok_value)
self.pubkey2_entry.grid(row=1, column=1, sticky="ew")
n2_label = tk.Label(left_frame, text="N:")
n2_label.grid(row=2, column=0, sticky="e")
self.n2_entry = tk.Label(left_frame, textvariable=self.foreign_n_value)
self.n2_entry.grid(row=2, column=1, sticky="ew")
formKeysButton = tk.Button(self, text="Сформировать ключи", command=self.formKeys)
formKeysButton.pack()
def formKeys(self):
rsaGen = rk.RSAKeygen()
p, q, n, e, d = rsaGen.generate_rsa_keys()
self.my_keys.append(e)
self.my_keys.append(d)
self.my_keys.append(n)
self.prime_p.set(p)
self.prime_q.set(q)
self.openk_value.set(e)
self.n_value.set(n)
prime_generator.py
from tkinter import messagebox
import random
class PrimeGen:
def generate_prime(self):
while True:
n = random.randint(2**31, 2**32 - 1)
if self.miller_rabin_test(n) and self.fermat_test(n):
messagebox.showinfo("Проверка на простоту", f"Число прошло тест Ферма и Миллера-Рабина на простоту")
return n
def miller_rabin_test(self, n):
if n == 2 or n == 3:
return True
if n < 2 or n % 2 == 0:
return False
d = n - 1
r = 0
while d % 2 == 0:
d //= 2
r += 1
def witness(a):
x = pow(a, d, n)
if x == 1 or x == n - 1:
return True
for _ in range(r - 1):
x = pow(x, 2, n)
if x == n - 1:
return True
return False
for _ in range(100):
a = random.randint(2, n - 2)
if not witness(a):
return False
return True
def fermat_test(self, n):
for _ in range(100):
a = random.randint(2, n - 1)
if pow(a, n - 1, n) != 1:
return False
return True
rsa_keygen.py
import prime_generator as pg
import random
class RSAKeygen:
def gcd(self, a, b):
"""Находит наибольший общий делитель двух чисел."""
while b != 0:
a, b = b, a % b
return a
def extended_gcd(self, a, b):
"""Расширенный алгоритм Евклида для нахождения обратного элемента по модулю."""
if a == 0:
return b, 0, 1
gcd, x, y = self.extended_gcd(b % a, a)
return gcd, y - (b // a) * x, x
def generate_coprime(self, phi):
"""Генерирует взаимно простое число с заданным значением phi."""
while True:
e = random.randint(2, phi - 1)
if self.gcd(e, phi) == 1:
return e
def generate_rsa_keys(self):
gen = pg.PrimeGen()
p = gen.generate_prime()
q = gen.generate_prime()
n = p * q
phi = (p - 1) * (q - 1)
e = self.generate_coprime(phi)
_, d, _ = self.extended_gcd(e, phi)
d %= phi
return p, q, n, e, d
Источник: Stack Overflow на русском