Пишем калькулятор на python и делаем из него полноценное приложение Windows

Для тех кто убил калькулятор на своей винде (как я). Пишем свой калькулятор на python в одном файле и делаем из него полноценное приложение Windows.

PYTHON
                    </span>import tkinter as tk<br />
from tkinter import ttk<br />
import math</p>
<p>class MatrixCalculator:<br />
def __init__(self):<br />
self.root = tk.Tk()<br />
self.root.title("Matrix Calculator")<br />
self.root.configure(bg='#0a0a0a')<br />
self.root.attributes('-alpha', 0.92)</p>
<p>self.base_font_size = 14<br />
self.base_width = 400<br />
self.base_height = 550</p>
<p>self.root.minsize(self.base_width, self.base_height)<br />
self.is_fullscreen = False</p>
<p>self.current_input = ""<br />
self.history_text = ""</p>
<p>self.setup_ui()<br />
self.setup_bindings()</p>
<p>def get_scaled_size(self, base_size):<br />
screen_width = self.root.winfo_screenwidth()<br />
scale_factor = screen_width / 1920<br />
return max(int(base_size * scale_factor), base_size)</p>
<p>def setup_ui(self):<br />
self.current_font_size = self.get_scaled_size(self.base_font_size)<br />
self.display_font_size = self.get_scaled_size(20)</p>
<p>colors = {<br />
'bg': '#0a0a0a',<br />
'display_bg': '#1a1a1a',<br />
'display_fg': '#e8e8e8',<br />
'button_bg': '#2a2a2a',<br />
'button_fg': '#ffffff',<br />
'button_active': '#3a3a3a',<br />
'operator_bg': '#404040',<br />
'operator_fg': '#ffffff',<br />
'equals_bg': '#505050',<br />
'history_fg': '#aaaaaa'<br />
}</p>
<p>top_frame = tk.Frame(self.root, bg=colors['bg'])<br />
top_frame.pack(fill='x', padx=15, pady=8)</p>
<p>self.history_label = tk.Label(top_frame, text="", fg=colors['history_fg'],<br />
bg=colors['bg'], font=('Arial', self.current_font_size-2),<br />
anchor='e')<br />
self.history_label.pack(side='left', fill='x', expand=True)</p>
<p>transparency_frame = tk.Frame(top_frame, bg=colors['bg'])<br />
transparency_frame.pack(side='right')</p>
<p>tk.Label(transparency_frame, text="◉", fg=colors['history_fg'],<br />
bg=colors['bg'], font=('Arial', 10)).pack(side='left')</p>
<p>self.alpha_var = tk.DoubleVar(value=0.92)<br />
alpha_scale = ttk.Scale(transparency_frame, from_=0.4, to=1.0,<br />
variable=self.alpha_var, command=self.update_alpha,<br />
orient='horizontal', length=70)<br />
alpha_scale.pack(side='left', padx=5)</p>
<p>self.display = tk.Entry(self.root, font=('Arial', self.display_font_size, 'bold'),<br />
justify='right', bg=colors['display_bg'], fg=colors['display_fg'],<br />
insertbackground=colors['display_fg'], bd=0, relief='flat')<br />
self.display.pack(fill='x', padx=15, pady=(0, 15), ipady=10)</p>
<p>buttons_frame = tk.Frame(self.root, bg=colors['bg'])<br />
buttons_frame.pack(fill='both', expand=True, padx=15, pady=(0, 15))</p>
<p>buttons = [<br />
('%', 'special'), ('√', 'special'), ('x²', 'special'), ('1/x', 'special'),<br />
('CE', 'clear'), ('C', 'clear'), ('⌫', 'clear'), ('÷', 'operator'),<br />
('7', 'digit'), ('8', 'digit'), ('9', 'digit'), ('×', 'operator'),<br />
('4', 'digit'), ('5', 'digit'), ('6', 'digit'), ('-', 'operator'),<br />
('1', 'digit'), ('2', 'digit'), ('3', 'digit'), ('+', 'operator'),<br />
('±', 'special'), ('0', 'digit'), ('.', 'digit'), ('=', 'equals')<br />
]
<p>button_styles = {<br />
'digit': {'bg': colors['button_bg'], 'fg': colors['button_fg'], 'active': colors['button_active']},<br />
'operator': {'bg': colors['operator_bg'], 'fg': colors['operator_fg'], 'active': colors['button_active']},<br />
'special': {'bg': colors['button_bg'], 'fg': '#e8b010', 'active': colors['button_active']},<br />
'clear': {'bg': '#5a2a2a', 'fg': '#ff6b6b', 'active': '#6a3a3a'},<br />
'equals': {'bg': colors['equals_bg'], 'fg': colors['button_fg'], 'active': colors['button_active']}<br />
}</p>
<p>row, col = 0, 0<br />
for btn_text, btn_type in buttons:<br />
style = button_styles[btn_type]
cmd = lambda x=btn_text: self.button_click(x)</p>
<p>btn = tk.Button(buttons_frame, text=btn_text,<br />
font=('Arial', self.current_font_size, 'bold'),<br />
bg=style['bg'], fg=style['fg'],<br />
activebackground=style['active'],<br />
activeforeground=style['fg'],<br />
bd=0, relief='flat', cursor='hand2',<br />
command=cmd)<br />
btn.grid(row=row, column=col, sticky='nsew', padx=2, pady=2)</p>
<p>if btn_text == '0':<br />
btn.grid(columnspan=2, sticky='nsew')<br />
col += 1</p>
<p>col += 1<br />
if col > 3:<br />
col = 0<br />
row += 1</p>
<p>for i in range(6):<br />
buttons_frame.grid_rowconfigure(i, weight=1)<br />
for i in range(4):<br />
buttons_frame.grid_columnconfigure(i, weight=1)</p>
<p>def setup_bindings(self):<br />
self.root.bind('', self.toggle_fullscreen)<br />
self.root.bind('', self.exit_fullscreen)</p>
<p>for key in '0123456789':<br />
self.root.bind(f'', lambda e, k=key: self.button_click(k))</p>
<p>self.root.bind('', lambda e: self.button_click('+'))<br />
self.root.bind('', lambda e: self.button_click('-'))<br />
self.root.bind('', lambda e: self.button_click('×'))<br />
self.root.bind('', lambda e: self.button_click('÷'))<br />
self.root.bind('', lambda e: self.button_click('.'))<br />
self.root.bind('', lambda e: self.button_click('='))<br />
self.root.bind('', lambda e: self.button_click('='))<br />
self.root.bind('', lambda e: self.button_click('⌫'))<br />
self.root.bind('', lambda e: self.button_click('CE'))<br />
self.root.bind('', lambda e: self.button_click('C'))</p>
<p>def update_alpha(self, value):<br />
self.root.attributes('-alpha', float(value))</p>
<p>def toggle_fullscreen(self, event=None):<br />
self.is_fullscreen = not self.is_fullscreen<br />
self.root.attributes('-fullscreen', self.is_fullscreen)</p>
<p>def exit_fullscreen(self, event=None):<br />
self.is_fullscreen = False<br />
self.root.attributes('-fullscreen', False)</p>
<p>def button_click(self, symbol):<br />
if symbol == '=':<br />
self.calculate()<br />
elif symbol == 'C':<br />
self.clear()<br />
elif symbol == 'CE':<br />
self.clear_entry()<br />
elif symbol == '⌫':<br />
self.backspace()<br />
elif symbol == '±':<br />
self.plus_minus()<br />
elif symbol == 'x²':<br />
self.square()<br />
elif symbol == '√':<br />
self.square_root()<br />
elif symbol == '1/x':<br />
self.reciprocal()<br />
elif symbol == '%':<br />
self.percentage()<br />
else:<br />
self.current_input += str(symbol)<br />
self.display.delete(0, tk.END)<br />
self.display.insert(0, self.current_input)</p>
<p>if symbol not in ['=', 'C', 'CE', '⌫']:<br />
self.history_text += symbol<br />
self.history_label.config(text=self.history_text[-40:])</p>
<p>def calculate(self):<br />
try:<br />
expression = self.current_input.replace('×', '*').replace('÷', '/')<br />
result = eval(expression)</p>
<p>if result == int(result):<br />
result = int(result)<br />
else:<br />
result = round(result, 10)</p>
<p>self.display.delete(0, tk.END)<br />
self.display.insert(0, str(result))<br />
self.current_input = str(result)<br />
self.history_text += f"={result}"<br />
except:<br />
self.display.delete(0, tk.END)<br />
self.display.insert(0, "Error")<br />
self.current_input = ""</p>
<p>def clear(self):<br />
self.current_input = ""<br />
self.history_text = ""<br />
self.display.delete(0, tk.END)<br />
self.history_label.config(text="")</p>
<p>def clear_entry(self):<br />
self.current_input = ""<br />
self.display.delete(0, tk.END)</p>
<p>def backspace(self):<br />
self.current_input = self.current_input[:-1]
self.history_text = self.history_text[:-1]
self.display.delete(0, tk.END)<br />
self.display.insert(0, self.current_input)<br />
self.history_label.config(text=self.history_text)</p>
<p>def plus_minus(self):<br />
if self.current_input:<br />
if self.current_input[0] == '-':<br />
self.current_input = self.current_input[1:]
else:<br />
self.current_input = '-' + self.current_input<br />
self.display.delete(0, tk.END)<br />
self.display.insert(0, self.current_input)</p>
<p>def square(self):<br />
try:<br />
result = float(self.current_input) ** 2<br />
result = int(result) if result == int(result) else round(result, 10)<br />
self.display.delete(0, tk.END)<br />
self.display.insert(0, str(result))<br />
self.current_input = str(result)<br />
self.history_text += f"²={result}"<br />
except:<br />
self.display.delete(0, tk.END)<br />
self.display.insert(0, "Error")</p>
<p>def square_root(self):<br />
try:<br />
result = math.sqrt(float(self.current_input))<br />
result = int(result) if result == int(result) else round(result, 10)<br />
self.display.delete(0, tk.END)<br />
self.display.insert(0, str(result))<br />
self.current_input = str(result)<br />
self.history_text += f"√={result}"<br />
except:<br />
self.display.delete(0, tk.END)<br />
self.display.insert(0, "Error")</p>
<p>def reciprocal(self):<br />
try:<br />
result = 1 / float(self.current_input)<br />
result = int(result) if result == int(result) else round(result, 10)<br />
self.display.delete(0, tk.END)<br />
self.display.insert(0, str(result))<br />
self.current_input = str(result)<br />
self.history_text += f"¹/ₓ={result}"<br />
except:<br />
self.display.delete(0, tk.END)<br />
self.display.insert(0, "Error")</p>
<p>def percentage(self):<br />
try:<br />
result = float(self.current_input) / 100<br />
result = int(result) if result == int(result) else round(result, 10)<br />
self.display.delete(0, tk.END)<br />
self.display.insert(0, str(result))<br />
self.current_input = str(result)<br />
self.history_text += f"%={result}"<br />
except:<br />
self.display.delete(0, tk.END)<br />
self.display.insert(0, "Error")</p>
<p>def run(self):<br />
self.root.mainloop()</p>
<p>if __name__ == "__main__":<br />
calc = MatrixCalculator()<br />
calc.run()
                

bash

POWERSHELL
                    pip install pyinstaller<br />
pyinstaller --onefile --windowed --name "MatrixCalculator" calculator.py
                
Предыдущая запись
Установка Notepad++ через PowerShell
Следующая запись
Создаём флешку для востановления Windows 11 через утилиту DiskPart (ручной метод)

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Заполните поле
Заполните поле
Пожалуйста, введите корректный адрес email.
Вы должны согласиться с условиями для продолжения