Опишите квадрат как структуру данных - обычный класс, датакласс, именованный кортеж, что угодно. Это позволит вам:
1. убрать дублирование кода для двух квадратов, и устранить нужду в десятках переменных. У вас будет два экземпляра класса "квадрат", а данные квадратов будут скрыты внутри них.
2. разделить описание квадрата + операции над ним и его отображение в интерфейсе. Два простых взаимодействующих класса - это обычно лучше чем один сложный.
Также имейте ввиду, что часто лучше хранить необходимый минимум данных, и вычислять остальное. Это позволит избежать противоречий в данных - например, в вашем коде координаты вершин могут формировать произвольный четырёхугольник вместо квадрата. Если нужен именно квадрат, и именно не-повёрнутый, то я бы написал класс примерно так:
class Square:
#конструктор принимает координаты левой верхней вершины и длину стороны квадрата
def __init__(self, x: int, y: int, a: int):
self.topleft = (x,y) #давайте переменным более читаемые имена!
self.side = a
@property
#это будет свойство - оно будет вычисляться по запросу, а не храниться
def topright(self):
return (self.topleft[0]+self.side, self.topleft[1])
@property
def bottomleft(self):
return (self.topleft[0], self.topleft[1]+self.side)
@property
def bottomright(self):
return (self.topleft[0]+self.side, self.topleft[1]+self.side)
def save(self, file): #сохраняем себя в файл
pass #код этого метода напишите сами
@classmethod
# это метод класса, он будет вызываться как Square.load(), а не для конкретного экземпляра Square
def load(cls, file): #загружаем новый квадрат из файла
x = ... #напишите код загрузки сами
y = ...
side = ...
return cls(x, y, side)