@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.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
26 апр. 2024, в 07:47
2000 руб./за проект
26 апр. 2024, в 06:46
1000 руб./в час
26 апр. 2024, в 05:31
1000 руб./за проект