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()
Как можно оптимизировать его лучше? Или нет смысла использовать ООП в принципе?