@CImanov

Пожайлуста дайте советы по улучшению программного кода?

Здравствуйте, я бы хотел чтобы вы взглянули на код ниже я написал маленький калькулятор сразу скажу что математические функции я взял из одного видео так что не до конца понимаю их работу но в основном код мой и хотелось бы чтобы вы дали мне советы и рекомендации и еще указали бы на мои ошибки в коде, я новичок в python могу только классный интерфейс замутить а функции еще не до изучил посмотрите может можно как то по иному или лучше реализовать можно,
За ранее огромное спасибо.
from tkinter import *
from tkinter import ttk

def iCalc(source, side):
    storeObj = Frame(source)
    storeObj.pack(side=side, expand=True, fill='both')
    return storeObj

def button(source, side, text, command=None):
    storeObj = Button(source, relief='flat',  text=text, command=command, font='Simple 16')
    storeObj.pack(side=side, expand=True, fill='both')
    return storeObj

class App(Tk):
    def __init__(self):
        Tk.__init__(self)
        StrVar = StringVar()

        self.title('Calculator')
        self.overrideredirect(True)
        self.minsize(width=256, height=384)
        self.geometry('384x384+192+192')
        self.attributes('-topmost', True)
        self.config(background='#2f2f2f')

        self.frmCaption = Frame(self, height=40, bg='#2f2f2f')
        self.frmCaption.propagate(False)
        self.frmCaption.pack(side='top', fill='both')

        self.frmFooter = Frame(self, height=20, bg='#f2f2f2')
        self.frmFooter.propagate(False)
        self.frmFooter.pack(side='bottom', fill='both')

        self.btnMove = Button(self.frmCaption, relief='flat', bg='#f2f2f2', cursor='fleur')
        self.btnMove.bind('<ButtonPress-1>', self.TeMotion)
        self.btnMove.bind('<ButtonRelease-1>', self.FeMotion)
        self.btnMove.bind('<B1-Motion>', self.GoMotion)
        self.btnMove.bind('<Double-Button-1>', self._dty)
        self.btnMove.place(x=2, y=2, width=36, height=36)
        self.entInput = Entry(self.frmCaption, relief='flat', textvariable=StrVar, justify='center', insertwidth=1, font='Simple 16')
        self.entInput.bind('<Return>', lambda e, s=self, storeObj=StrVar: s.calc(storeObj), '+')
        self.entInput.place(x=40, y=2, relwidth=1, width=-42, height=36)
        self.sizeGrip = ttk.Sizegrip(self.frmFooter).place(x=-20, relx=1, y=0, width=18, height=18)
        
        self.frmPack = Frame(self, bg='#fff')
        self.frmPack.propagate(False)
        self.frmPack.place(x=2, y=40, width=-4, height=-62, relwidth=1, relheight=1)
        for clearBut in ("C"):
            erase = iCalc(self.frmPack, TOP)
            for ichar in clearBut:
                button(erase, LEFT, ichar, lambda storeObj=StrVar, q=ichar: storeObj.set(''))

        for NumBut in ('789/', '456*', '123-', '0.+'):
            FunctionNum = iCalc(self.frmPack, TOP)
            for iEquals in NumBut:
                button(FunctionNum, LEFT, iEquals, lambda storeObj=StrVar, q=iEquals: storeObj.set(storeObj.get() + q))
        EqualsButton = iCalc(self.frmPack, TOP)
        for iEquals in '=':
            if iEquals == '=':
                btniEquals = button(EqualsButton, LEFT, iEquals)
                btniEquals.bind('<ButtonRelease-1>', lambda e, s=self, storeObj=StrVar: s.calc(storeObj), '+')
            else:
                btniEquals = button(EqualsButton, LEFT, iEquals, lambda storeObj=StrVar, s=' %s '%iEquals: storeObj.set(storeObj.get()+s))
    def calc(self, StrVar):
        try:
            StrVar.set(eval(StrVar.get()))
        except:
            StrVar.set('')

    def TeMotion(self, event):
        self.x = event.x
        self.y = event.y
    def FeMotion(self, event):
        self.x = None
        self.y = None
    def GoMotion(self, event):
        AxisX = event.x - self.x
        AxisY = event.y - self.y
        x = self.winfo_x() + AxisX
        y = self.winfo_y() + AxisY
        self.geometry('+%s+%s' % (x, y))
    def _dty(self, event):
        self.destroy()

if __name__ == '__main__':
    self = App().mainloop()
  • Вопрос задан
  • 747 просмотров
Решения вопроса 1
@bromzh
Drugs-driven development
Фигнёй ты страдаешь. Сперва изучи работу со строками и числами, списки, кортежи, множества, словари, итераторы и генераторы. Потом функции поизучай, как они в питоне определяются и вызываются, как передавать аргументы, зачем нужны одинарные и двойные звёздочки в параметрах функции. Потом изучай ООП, какое оно в питоне, чем отличается от других реализаций. Зачем и когда вообще нужны классы, а когда нет. Потом всякие фишки питоновские касательно классов, что такое классовая переменная, метод класса, статический метод, property. Потом можно изучить декораторы и другие функциональные штуки питона. Заодно поймёшь, что это за лямбды у тебя в коде, что такое замыкание и контексты видимости переменных. Потом изучай стандартную библиотеку: работу с датами, с json, с сетью, файлами и сокетами, асинхронный ввод-вывод (надеюсь ты 3-ю ветку изучаешь).
Попутно вызубри pep8. Ну и всё это естественно на практических примерах. Примеры есть на всяких codeacademy и других подобных сайтах.
Потом можешь выбирать направление и изучать библиотеки и фреймворки, которые люди часто используют. Если это, например, веб - то это django, tornado и пр.

А бездумное копирование кода с видео. который ты сам не понимаешь и простыни довольно однотипного кода tkinter не помогут тебе в изучении этого прекрасного языка.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@akonovalov
Программист на компьютере
Утилиты pep8, pylint, pep257 или их производные навроде flake8 - подскажут тебе, что не так в твоём коде. Также рекомендуется просмотр кода (но без фанатизма) популярных исходников, например Twisted.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы