Simple_calculator

Форк
0
/
Simple_calculator.py 
277 строк · 11.5 Кб
1
"""
2
Примитивный калькулятор с применением встроенного фреймворка для построения
3
пользовательского интерфейса Tkinter
4
"""
5

6
import tkinter as tk
7
import tkinter.ttk as ttk
8

9

10
class Example(ttk.Frame):
11
    def __init__(self, parent):
12
        """
13
        Конструктов приложения с инициализацией метода построения интерфейса.
14
        :param parent: ссылка на родительское окно приложения
15
        """
16
        ttk.Frame.__init__(self)  # вызов конструктора родительского класса
17
        self.parent = parent  # сохранение ссылки на основное окно
18
        self.entry = ttk.Entry(self, font=('serif', 12), justify=tk.RIGHT)  # создание текстового однострочного поля
19
        self.entry.insert(tk.END, '0')  # базовый ноль на экране
20
        self.memory = 0  # создание ячейки памяти, в качестве 2-ой ячейки будет entry
21
        self.clear_screen = True
22
        self.action = ''  # создание указателя на действие
23
        self.action_case = {'/': lambda x, y: x / y,  # набор действий
24
                            '*': lambda x, y: x * y,
25
                            '+': lambda x, y: x + y,
26
                            '-': lambda x, y: x - y}
27
        self.init_ui()  # инициализация метода построения интерфейса
28

29
    def init_ui(self):
30
        """
31
        Метод построения интерфейса калькулятора.
32
        """
33
        self.parent.title('Калькулятор на Tkinter')  # установка имени окна
34
        ttk.Style().configure('TButton', padding=(0, 5, 0, 5), font=('serif', 12))
35
        ttk.Style().configure('TEntry', padding=(0, 5, 0, 5))
36
        # устанавливаем стиль для кнопок включая отступы и шрифт
37
        self.columnconfigure(0, pad=3)  # конфигурирование столбцов сетки
38
        self.columnconfigure(1, pad=3)
39
        self.columnconfigure(2, pad=3)
40
        self.columnconfigure(3, pad=3)
41
        self.rowconfigure(0, pad=3)  # конфигурирование строк сетки
42
        self.rowconfigure(1, pad=3)
43
        self.rowconfigure(2, pad=3)
44
        self.rowconfigure(3, pad=3)
45
        self.rowconfigure(4, pad=3)
46
        self.rowconfigure(5, pad=3)
47
        self.entry.grid(row=0, columnspan=4, sticky=tk.W + tk.E)  # размещение текстового поля в нулевой строке
48
        # с заполнением на 4 клетки сетки и закреплением к левому и правому краю рамки
49
        cls = ttk.Button(self, text='Очистить', command=self.clear)  # создание и размещение кнопок калькулятор
50
        cls.grid(row=1, column=0)
51
        bck = ttk.Button(self, text='Удалить', command=self.delete)
52
        bck.grid(row=1, column=1)
53
        rev = ttk.Button(self, text='+/-', command=self.neg_pos)  # пустая кнопка
54
        rev.grid(row=1, column=2)
55
        clo = ttk.Button(self, text='Закрыть', command=quit)
56
        clo.grid(row=1, column=3)
57
        sev = ttk.Button(self, text='7', command=self.enter_7)
58
        sev.grid(row=2, column=0)
59
        eig = ttk.Button(self, text='8', command=self.enter_8)
60
        eig.grid(row=2, column=1)
61
        nin = ttk.Button(self, text='9', command=self.enter_9)
62
        nin.grid(row=2, column=2)
63
        div = ttk.Button(self, text='/', command=self.division)
64
        div.grid(row=2, column=3)
65
        fou = ttk.Button(self, text='4', command=self.enter_4)
66
        fou.grid(row=3, column=0)
67
        fiv = ttk.Button(self, text='5', command=self.enter_5)
68
        fiv.grid(row=3, column=1)
69
        six = ttk.Button(self, text='6', command=self.enter_6)
70
        six.grid(row=3, column=2)
71
        mul = ttk.Button(self, text='*', command=self.multiplication)
72
        mul.grid(row=3, column=3)
73
        one = ttk.Button(self, text='1', command=self.enter_1)
74
        one.grid(row=4, column=0)
75
        two = ttk.Button(self, text='2', command=self.enter_2)
76
        two.grid(row=4, column=1)
77
        thr = ttk.Button(self, text='3', command=self.enter_3)
78
        thr.grid(row=4, column=2)
79
        mns = ttk.Button(self, text='-', command=self.subtraction)
80
        mns.grid(row=4, column=3)
81
        zer = ttk.Button(self, text='0', command=self.enter_0)
82
        zer.grid(row=5, column=0)
83
        dot = ttk.Button(self, text='.', command=self.enter_dot)
84
        dot.grid(row=5, column=1)
85
        equ = ttk.Button(self, text='=', command=self.equally)
86
        equ.grid(row=5, column=2)
87
        pls = ttk.Button(self, text='+', command=self.addition)
88
        pls.grid(row=5, column=3)
89
        self.pack()
90

91
    def enter_1(self):
92
        """
93
        Переадресация вызова на метод ввода цифры с передачей ее в виде аргумента.
94
        """
95
        self.enter_digit('1')
96

97
    def enter_2(self):
98
        """
99
        Переадресация вызова на метод ввода цифры с передачей ее в виде аргумента.
100
        """
101
        self.enter_digit('2')
102

103
    def enter_3(self):
104
        """
105
        Переадресация вызова на метод ввода цифры с передачей ее в виде аргумента.
106
        """
107
        self.enter_digit('3')
108

109
    def enter_4(self):
110
        """
111
        Переадресация вызова на метод ввода цифры с передачей ее в виде аргумента.
112
        """
113
        self.enter_digit('4')
114

115
    def enter_5(self):
116
        """
117
        Переадресация вызова на метод ввода цифры с передачей ее в виде аргумента.
118
        """
119
        self.enter_digit('5')
120

121
    def enter_6(self):
122
        """
123
        Переадресация вызова на метод ввода цифры с передачей ее в виде аргумента.
124
        """
125
        self.enter_digit('6')
126

127
    def enter_7(self):
128
        """
129
        Переадресация вызова на метод ввода цифры с передачей ее в виде аргумента.
130
        """
131
        self.enter_digit('7')
132

133
    def enter_8(self):
134
        """
135
        Переадресация вызова на метод ввода цифры с передачей ее в виде аргумента.
136
        """
137
        self.enter_digit('8')
138

139
    def enter_9(self):
140
        """
141
        Переадресация вызова на метод ввода цифры с передачей ее в виде аргумента.
142
        """
143
        self.enter_digit('9')
144

145
    def enter_0(self):
146
        """
147
        Переадресация вызова на метод ввода цифры с передачей ее в виде аргумента.
148
        """
149
        self.enter_digit('0')
150

151
    def neg_pos(self):
152
        """
153
        Метод установки знака числа.
154
        """
155
        if self.entry.get() == 'Error' or self.entry.get() == '0' or not self.entry.get():  # блокирование ввода если имеется ошибка
156
            return
157
        elif self.entry.get()[0] == '-':
158
            self.entry.delete(0)
159
        else:
160
            self.entry.insert(0, '-')
161

162
    def cls(self):
163
        """
164
        Метод очистки экрана
165
        """
166
        self.entry.delete(0, tk.END)
167
        self.clear_screen = False
168

169
    def enter_dot(self):
170
        """
171
        Метод ввода десятичной точки
172
        """
173
        if self.clear_screen:
174
            self.cls()
175
        if '.' in self.entry.get():
176
            return
177
        elif self.entry.get():
178
            self.entry.insert(tk.END, '.')
179
        else:
180
            self.entry.insert(tk.END, '0.')
181

182
    def clear(self):
183
        """
184
        Метод очистки калькулятора
185
        """
186
        self.entry.delete(0, tk.END)  # очистка экрана
187
        self.entry.insert(tk.END, '0')  # базовый ноль на экране
188
        self.memory = 0  # очистка памяти
189
        self.action = ''  # очистка указателя операций
190

191
    def delete(self):
192
        """
193
        Метод удаления последнего символа на экране
194
        """
195
        if self.clear_screen:
196
            self.cls()
197
        self.entry.delete(len(self.entry.get()) - 1)  # удаление последнего символа
198
        if not self.entry.get():
199
            self.entry.insert(tk.END, '0')
200

201
    def division(self):
202
        """
203
        Переадресация вызова на метод ввода действия с передачей его в виде аргумента.
204
        """
205
        self.actions('/')
206

207
    def multiplication(self):
208
        """
209
        Переадресация вызова на метод ввода действия с передачей его в виде аргумента.
210
        """
211
        self.actions('*')
212

213
    def subtraction(self):
214
        """
215
        Переадресация вызова на метод ввода действия с передачей его в виде аргумента.
216
        """
217
        self.actions('-')
218

219
    def addition(self):
220
        """
221
        Переадресация вызова на метод ввода действия с передачей его в виде аргумента.
222
        """
223
        self.actions('+')
224

225
    def equally(self):
226
        """
227
        Переадресация вызова на метод ввода действия равно.
228
        """
229
        self.actions()
230

231
    def enter_digit(self, digit: str):
232
        """
233
        Метод ввода цифры
234
        :param digit: текст
235
        """
236
        if self.entry.get() == '0' or self.clear_screen:
237
            self.cls()
238
        self.entry.insert(tk.END, digit)
239

240
    def actions(self, op: str = ''):
241
        """
242
        Метод выполнения действий.
243
        :param op: текст - знак действия -,+,/,*
244
        """
245
        try:
246
            if self.entry.get() == 'Error' or self.entry.get()[-1] == '.':
247
                return
248
            elif self.action:
249
                self.memory = self.action_case[self.action](self.memory, float(self.entry.get()))
250
                if self.memory % 1 == 0:
251
                    self.memory = int(self.memory)
252
                self.cls()
253
                self.entry.insert(0, self.memory)
254
                self.action = op
255
                self.clear_screen = True
256
                return
257
            self.action = op
258
            self.memory = float(self.entry.get())
259
            self.clear_screen = True
260
        except (ZeroDivisionError, ValueError):
261
            self.cls()
262
            self.entry.insert(tk.END, 'Error')
263
            self.action = ''
264
            self.clear_screen = True
265

266

267
def main():
268
    """
269
    Функция запуска основного цикла приложения
270
    """
271
    root = tk.Tk()  # создание главного окна приложения
272
    Example(root)  # создание экземпляра класса приложения
273
    root.mainloop()  # запуск основного цикла приложения
274

275

276
if __name__ == '__main__':
277
    main()
278

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.