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…
x
Reference in New Issue
Block a user