Python. Оптимизирование читаемости кода с библиотекой tkinter, путем использования ООП

Давно писал код для перевода единиц измерения длины.

import tkinter as tk
from tkinter import ttk

window = tk.Tk()
window.title('Перевод единиц измерения из Ru в USA')
window.geometry('300x400')
window.resizable(False, False)
icon = tk.PhotoImage(file='D:/slatt/cool_pictures/самая лучшая ава на свете.png')
window.iconphoto(False, icon)

conversionData = {'Миля': .000621371, 'Ярд': 1.09361, 'Фут': 3.28084, 'Дюйм': 39.3701, 'Морская миля': .000539957}
unitsRus = ['Километр', 'Метр', 'Сантиметр', 'Миллиметр']
unitsUsa = ['Миля', 'Ярд', 'Фут', 'Дюйм', 'Морская миля']


def transfer():
    entered_dig = entDig.get()

    if entered_dig.isdigit():
        entered_dig = int(entered_dig)
    else:
        entDig.delete(0, tk.END)
        entDig.insert(0, 'Введите число')

    select_ru = comboboxRu.get()
    select_usa = comboboxUsa.get()

    if select_ru == 'Километр':
        entRes.delete(0, tk.END)
        entRes.insert(0, conversionData[select_usa] * 1000 * entered_dig)
    elif select_ru == 'Метр':
        entRes.delete(0, tk.END)
        entRes.insert(0, conversionData[select_usa] * entered_dig)
    elif select_ru == 'Сантиметр':
        entRes.delete(0, tk.END)
        entRes.insert(0, conversionData[select_usa] / 100 * entered_dig)
    elif select_ru == 'Миллиметр':
        entRes.delete(0, tk.END)
        entRes.insert(0, conversionData[select_usa] / 1000 * entered_dig)


lbl1 = tk.Label(text='Введите число')
lbl1.place(x=107, y=55)

entDig = ttk.Entry()
entDig.place(relx=.3, rely=.2)

lbl2 = tk.Label(text='Выберите единицу измерения')
lbl2.place(x=70, y=105)

comboboxRu = ttk.Combobox(values=unitsRus)
comboboxRu.place(x=82, y=130)

btn = ttk.Button(text='Перевести', command=transfer)
btn.pack(expand=True, anchor='center')

lbl3 = tk.Label(text='Выберите единицу измерения')
lbl3.place(x=70, y=245)

comboboxUsa = ttk.Combobox(values=unitsUsa)
comboboxUsa.place(x=82, y=270)

lblRes = tk.Label(text='Результат')
lblRes.place(x=120, y=295)

entRes = ttk.Entry()
entRes.place(relx=.3, y=320)

window.mainloop()


Начал изучать ООП и решил попробовать использовать его, чтобы оптимизировать код, но, лично у меня, он получился еще длиннее.

import tkinter as tk
from tkinter import ttk


class Window:
    def __init__(self):
        self.window = tk.Tk()
        self.icon = tk.PhotoImage(file='D:/slatt/cool_pictures/самая лучшая ава на свете.png')
        self.window.title('Перевод единиц измерения из Ru в USA')
        self.window.geometry('300x400')
        self.window.resizable(False, False)
        self.window.iconphoto(False, self.icon)

        self.conversionData = {'Миля': .000621371, 'Ярд': 1.09361, 'Фут': 3.28084, 'Дюйм': 39.3701, 'Морская миля': .000539957}
        self.unitsRus = ['Километр', 'Метр', 'Сантиметр', 'Миллиметр']
        self.unitsUsa = ['Миля', 'Ярд', 'Фут', 'Дюйм', 'Морская миля']

        self.lbl1 = tk.Label(text='Введите число')
        self.lbl2 = tk.Label(text='Выберите единицу измерения')
        self.lbl3 = tk.Label(text='Выберите единицу измерения')
        self.lblRes = tk.Label(text='Результат')

        self.btn = ttk.Button(text='Перевести', command=self.transfer)

        self.entDig = ttk.Entry()
        self.entRes = ttk.Entry()

        self.comboboxRu = ttk.Combobox(values=self.unitsRus)
        self.comboboxUsa = ttk.Combobox(values=self.unitsUsa)

        self.location()

        self.window.mainloop()

    def location(self):
        self.lbl1.place(x=107, y=55)
        self.lbl2.place(x=70, y=105)
        self.lbl3.place(x=70, y=245)
        self.lblRes.place(x=120, y=295)

        self.btn.pack(expand=True, anchor='center')

        self.entDig.place(relx=.3, rely=.2)
        self.entRes.place(relx=.3, y=320)

        self.comboboxRu.place(x=82, y=130)
        self.comboboxUsa.place(x=82, y=270)

    def transfer(self):
        entered_dig = self.entDig.get()

        if entered_dig.isdigit():
            entered_dig = int(entered_dig)
        else:
            self.entDig.delete(0, tk.END)
            self.entDig.insert(0, 'Введите число')

        select_ru = self.comboboxRu.get()
        select_usa = self.comboboxUsa.get()

        if select_ru == 'Километр':
            self.entRes.delete(0, tk.END)
            self.entRes.insert(0, self.conversionData[select_usa] * 1000 * entered_dig)
        elif select_ru == 'Метр':
            self.entRes.delete(0, tk.END)
            self.entRes.insert(0, self.conversionData[select_usa] * entered_dig)
        elif select_ru == 'Сантиметр':
            self.entRes.delete(0, tk.END)
            self.entRes.insert(0, self.conversionData[select_usa] / 100 * entered_dig)
        elif select_ru == 'Миллиметр':
            self.entRes.delete(0, tk.END)
            self.entRes.insert(0, self.conversionData[select_usa] / 1000 * entered_dig)


window = Window()

Как можно оптимизировать его лучше? Или нет смысла использовать ООП в принципе?


Ответы (0 шт):