Initial commit
This commit is contained in:
commit
1c221e7d61
43
.gitignore
vendored
Normal file
43
.gitignore
vendored
Normal file
@ -0,0 +1,43 @@
|
||||
# Python
|
||||
__pycache__/
|
||||
*.py[cod]
|
||||
*$py.class
|
||||
*.so
|
||||
.Python
|
||||
env/
|
||||
build/
|
||||
develop-eggs/
|
||||
dist/
|
||||
downloads/
|
||||
eggs/
|
||||
.eggs/
|
||||
lib/
|
||||
lib64/
|
||||
parts/
|
||||
sdist/
|
||||
var/
|
||||
wheels/
|
||||
*.egg-info/
|
||||
.installed.cfg
|
||||
*.egg
|
||||
|
||||
# Virtual Environment
|
||||
venv/
|
||||
ENV/
|
||||
.env
|
||||
.venv
|
||||
|
||||
# PyInstaller
|
||||
*.manifest
|
||||
*.spec
|
||||
|
||||
# IDE
|
||||
.idea/
|
||||
.vscode/
|
||||
*.swp
|
||||
*.swo
|
||||
.DS_Store
|
||||
|
||||
# Project specific
|
||||
calculator.ico
|
||||
calculator.icns
|
25
build.py
Normal file
25
build.py
Normal file
@ -0,0 +1,25 @@
|
||||
import os
|
||||
import sys
|
||||
import PyInstaller.__main__
|
||||
|
||||
# 获取当前操作系统
|
||||
current_os = sys.platform
|
||||
|
||||
# 设置图标文件名
|
||||
icon_file = "calculator.ico" if current_os == "win32" else "calculator.icns"
|
||||
|
||||
# PyInstaller参数
|
||||
args = [
|
||||
"calculator.py",
|
||||
"--name=现代计算器",
|
||||
"--onefile",
|
||||
"--noconsole",
|
||||
"--clean",
|
||||
f"--icon={icon_file}" if os.path.exists(icon_file) else None,
|
||||
]
|
||||
|
||||
# 过滤掉None值
|
||||
args = [arg for arg in args if arg is not None]
|
||||
|
||||
# 执行打包
|
||||
PyInstaller.__main__.run(args)
|
217
calculator.py
Normal file
217
calculator.py
Normal file
@ -0,0 +1,217 @@
|
||||
import sys
|
||||
from PyQt6.QtWidgets import (
|
||||
QApplication,
|
||||
QMainWindow,
|
||||
QWidget,
|
||||
QGridLayout,
|
||||
QPushButton,
|
||||
QLineEdit,
|
||||
)
|
||||
from PyQt6.QtCore import Qt
|
||||
from PyQt6.QtGui import QFont, QKeyEvent
|
||||
|
||||
|
||||
class Calculator(QMainWindow):
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
self.setWindowTitle("现代计算器")
|
||||
self.setFixedSize(400, 500)
|
||||
self.setStyleSheet(
|
||||
"""
|
||||
QMainWindow {
|
||||
background-color: #f0f0f0;
|
||||
}
|
||||
QLineEdit {
|
||||
background-color: white;
|
||||
border: 2px solid #e0e0e0;
|
||||
border-radius: 8px;
|
||||
padding: 10px;
|
||||
margin: 10px;
|
||||
font-size: 24px;
|
||||
color: #333;
|
||||
}
|
||||
QPushButton {
|
||||
background-color: white;
|
||||
border: none;
|
||||
border-radius: 20px;
|
||||
padding: 20px;
|
||||
margin: 5px;
|
||||
font-size: 18px;
|
||||
color: #333;
|
||||
}
|
||||
QPushButton:hover {
|
||||
background-color: #e0e0e0;
|
||||
}
|
||||
QPushButton:pressed {
|
||||
background-color: #d0d0d0;
|
||||
}
|
||||
QPushButton[type="operator"] {
|
||||
background-color: #FF9500;
|
||||
color: white;
|
||||
}
|
||||
QPushButton[type="operator"]:hover {
|
||||
background-color: #FFa530;
|
||||
}
|
||||
QPushButton[type="equal"] {
|
||||
background-color: #007AFF;
|
||||
color: white;
|
||||
}
|
||||
QPushButton[type="equal"]:hover {
|
||||
background-color: #0090FF;
|
||||
}
|
||||
QPushButton[type="clear"] {
|
||||
background-color: #FF3B30;
|
||||
color: white;
|
||||
}
|
||||
QPushButton[type="clear"]:hover {
|
||||
background-color: #FF4B40;
|
||||
}
|
||||
"""
|
||||
)
|
||||
|
||||
# 创建中心部件和网格布局
|
||||
central_widget = QWidget()
|
||||
self.setCentralWidget(central_widget)
|
||||
grid = QGridLayout(central_widget)
|
||||
grid.setSpacing(10)
|
||||
grid.setContentsMargins(20, 20, 20, 20)
|
||||
|
||||
# 创建显示结果的文本框
|
||||
self.display = QLineEdit()
|
||||
self.display.setReadOnly(True)
|
||||
self.display.setAlignment(Qt.AlignmentFlag.AlignRight)
|
||||
self.display.setMaxLength(15)
|
||||
self.display.setMinimumHeight(80)
|
||||
self.display.setText("0")
|
||||
grid.addWidget(self.display, 0, 0, 1, 4)
|
||||
|
||||
# 按钮文本和它们的位置
|
||||
buttons = {
|
||||
"C": (1, 0, "clear"),
|
||||
"±": (1, 1, "operator"),
|
||||
"%": (1, 2, "operator"),
|
||||
"/": (1, 3, "operator"),
|
||||
"7": (2, 0, "number"),
|
||||
"8": (2, 1, "number"),
|
||||
"9": (2, 2, "number"),
|
||||
"*": (2, 3, "operator"),
|
||||
"4": (3, 0, "number"),
|
||||
"5": (3, 1, "number"),
|
||||
"6": (3, 2, "number"),
|
||||
"-": (3, 3, "operator"),
|
||||
"1": (4, 0, "number"),
|
||||
"2": (4, 1, "number"),
|
||||
"3": (4, 2, "number"),
|
||||
"+": (4, 3, "operator"),
|
||||
"0": (5, 0, "number"),
|
||||
".": (5, 2, "number"),
|
||||
"=": (5, 3, "equal"),
|
||||
}
|
||||
|
||||
# 创建并添加按钮
|
||||
for button_text, (row, col, button_type) in buttons.items():
|
||||
button = QPushButton(button_text)
|
||||
button.setProperty("type", button_type)
|
||||
button.clicked.connect(self.button_clicked)
|
||||
if button_text == "0":
|
||||
grid.addWidget(button, row, col, 1, 2)
|
||||
else:
|
||||
grid.addWidget(button, row, col)
|
||||
|
||||
# 添加按键映射字典
|
||||
self.key_mapping = {
|
||||
Qt.Key.Key_0: "0",
|
||||
Qt.Key.Key_1: "1",
|
||||
Qt.Key.Key_2: "2",
|
||||
Qt.Key.Key_3: "3",
|
||||
Qt.Key.Key_4: "4",
|
||||
Qt.Key.Key_5: "5",
|
||||
Qt.Key.Key_6: "6",
|
||||
Qt.Key.Key_7: "7",
|
||||
Qt.Key.Key_8: "8",
|
||||
Qt.Key.Key_9: "9",
|
||||
Qt.Key.Key_Plus: "+",
|
||||
Qt.Key.Key_Minus: "-",
|
||||
Qt.Key.Key_Asterisk: "*",
|
||||
Qt.Key.Key_Slash: "/",
|
||||
Qt.Key.Key_Period: ".",
|
||||
Qt.Key.Key_Return: "=",
|
||||
Qt.Key.Key_Enter: "=",
|
||||
Qt.Key.Key_Equal: "=",
|
||||
Qt.Key.Key_Escape: "C",
|
||||
Qt.Key.Key_Percent: "%",
|
||||
}
|
||||
|
||||
def keyPressEvent(self, event: QKeyEvent) -> None:
|
||||
"""处理键盘按键事件"""
|
||||
key = event.key()
|
||||
|
||||
# 处理数字键盘的输入
|
||||
if event.modifiers() == Qt.KeyboardModifier.KeypadModifier:
|
||||
if key == Qt.Key.Key_Plus:
|
||||
self.process_input("+")
|
||||
elif key == Qt.Key.Key_Minus:
|
||||
self.process_input("-")
|
||||
elif key == Qt.Key.Key_Asterisk:
|
||||
self.process_input("*")
|
||||
elif key == Qt.Key.Key_Slash:
|
||||
self.process_input("/")
|
||||
elif key == Qt.Key.Key_Enter:
|
||||
self.process_input("=")
|
||||
elif key == Qt.Key.Key_Period:
|
||||
self.process_input(".")
|
||||
|
||||
# 处理普通键盘的输入
|
||||
if key in self.key_mapping:
|
||||
self.process_input(self.key_mapping[key])
|
||||
|
||||
# 处理退格键
|
||||
elif key == Qt.Key.Key_Backspace:
|
||||
current_text = self.display.text()
|
||||
self.display.setText(current_text[:-1])
|
||||
|
||||
super().keyPressEvent(event)
|
||||
|
||||
def process_input(self, value: str) -> None:
|
||||
"""统一处理输入"""
|
||||
if value == "=":
|
||||
self.calculate_result()
|
||||
elif value == "C":
|
||||
self.display.setText("0")
|
||||
else:
|
||||
current_text = self.display.text()
|
||||
if current_text == "0":
|
||||
self.display.setText(value)
|
||||
else:
|
||||
new_text = current_text + value
|
||||
self.display.setText(new_text)
|
||||
|
||||
def calculate_result(self) -> None:
|
||||
"""计算结果"""
|
||||
try:
|
||||
current_text = self.display.text()
|
||||
# 处理百分号
|
||||
expression = current_text.replace("%", "/100")
|
||||
# 处理正负号
|
||||
expression = expression.replace("±", "-")
|
||||
result = str(eval(expression))
|
||||
self.display.setText(result)
|
||||
except:
|
||||
self.display.setText("错误")
|
||||
|
||||
def button_clicked(self):
|
||||
"""处理按钮点击事件"""
|
||||
button = self.sender()
|
||||
button_text = button.text()
|
||||
self.process_input(button_text)
|
||||
|
||||
|
||||
def main():
|
||||
app = QApplication(sys.argv)
|
||||
calculator = Calculator()
|
||||
calculator.show()
|
||||
sys.exit(app.exec())
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
2
requirements.txt
Normal file
2
requirements.txt
Normal file
@ -0,0 +1,2 @@
|
||||
PyQt6>=6.0.0
|
||||
pyinstaller>=6.0.0
|
17
setup.py
Normal file
17
setup.py
Normal file
@ -0,0 +1,17 @@
|
||||
from setuptools import setup
|
||||
|
||||
setup(
|
||||
name="modern-calculator",
|
||||
version="1.0.0",
|
||||
description="A modern calculator built with PyQt6",
|
||||
author="Your Name",
|
||||
packages=[""],
|
||||
install_requires=[
|
||||
"PyQt6>=6.0.0",
|
||||
],
|
||||
entry_points={
|
||||
"console_scripts": [
|
||||
"modern-calculator=calculator:main",
|
||||
],
|
||||
},
|
||||
)
|
Loading…
Reference in New Issue
Block a user