项目图片展示
这篇博客将详细介绍如何使用Python的ttkbootstrap模块创建一个功能齐全且美观的计算器应用程序。项目功能包括基本的算术运算、历史记录查看、主题切换、窗口大小调整等。本文将从项目环境设置、代码实现、功能介绍等方面进行详细讲解。
在开始之前,请确保您的开发环境中已经安装了以下工具和库:
安装ttkbootstrap库:
pip install ttkbootstrap
项目的主要文件包括:
calculator.py
:主程序文件,包含计算器的所有逻辑和UI设计。接下来是详细的代码实现及其功能说明。
首先,我们需要导入所需的库和模块。
import ttkbootstrap as ttk
from ttkbootstrap.constants import *
from tkinter import StringVar, Text, Menu, Toplevel, messagebox, simpledialog
import datetime
我们将所有的功能和UI组件封装在一个类中。
class Calculator:
def __init__(self, root):
self.root = root
self.root.title("计算器")
self.root.geometry("320x420")
self.root.resizable(False, False)
self.entry_var = StringVar()
self.history = []
self.create_menu()
self.create_widgets()
菜单栏包含历史记录查看、日期查看、开发者信息查看、修改主题和修改窗口大小等功能。
def create_menu(self):
menubar = Menu(self.root)
# 历史记录菜单
history_menu = Menu(menubar, tearoff=0)
history_menu.add_command(label="查看历史记录", command=self.show_history)
menubar.add_cascade(label="历史记录", menu=history_menu)
# 查看菜单
view_menu = Menu(menubar, tearoff=0)
view_menu.add_command(label="查看日期", command=self.show_date)
view_menu.add_command(label="查看开发者", command=self.show_developer)
menubar.add_cascade(label="查看", menu=view_menu)
# 修改菜单
edit_menu = Menu(menubar, tearoff=0)
# 修改主题子菜单
theme_menu = Menu(edit_menu, tearoff=0)
style = ttk.Style()
theme_names = style.theme_names() # 以列表的形式返回多个主题名
for theme_name in theme_names:
theme_menu.add_command(label=theme_name, command=lambda t=theme_name: self.change_theme(t))
edit_menu.add_cascade(label="修改主题", menu=theme_menu)
# 修改窗口大小功能
edit_menu.add_command(label="修改窗口大小", command=self.change_window_size)
menubar.add_cascade(label="修改", menu=edit_menu)
self.root.config(menu=menubar)
添加修改主题和修改窗口大小的具体实现。
def change_theme(self, theme_name):
style = ttk.Style()
style.theme_use(theme_name)
def change_window_size(self):
new_width = simpledialog.askinteger("输入宽度", "请输入新的窗口宽度:")
new_height = simpledialog.askinteger("输入高度", "请输入新的窗口高度:")
if new_width and new_height:
self.root.geometry(f"{new_width}x{new_height}")
计算器的主要UI组件包括显示结果的文本框和包含数字与操作符按钮的按钮面板。
def create_widgets(self):
# 显示结果和输入的只读文本框
entry = ttk.Entry(self.root, textvariable=self.entry_var, font=("Helvetica", 16), justify="right", state="readonly")
entry.grid(row=0, column=0, columnspan=5, sticky="nsew", ipadx=8, ipady=8, padx=10, pady=10)
# 定义按钮
buttons = [
'7', '8', '9', '/', 'C',
'4', '5', '6', '*', '删除',
'1', '2', '3', '-', '±',
'0', '.', '=', '+', 'CE',
'√', '平方', '1/x'
]
# 创建按钮并添加到窗口中
for i, button in enumerate(buttons):
if button != ' ':
b = ttk.Button(self.root, text=button, bootstyle=SUCCESS if button == '=' else PRIMARY, command=lambda b=button: self.button_press(b))
b.grid(row=i//5 + 1, column=i%5, sticky="nsew", padx=5, pady=5)
# 设置网格权重
for i in range(5):
self.root.columnconfigure(i, weight=1)
for i in range(6):
self.root.rowconfigure(i + 1, weight=1)
处理各类按钮点击事件,包括数字、操作符及特殊功能按钮。
def button_press(self, button_text):
current_text = self.entry_var.get()
if button_text == "C":
self.entry_var.set("")
elif button_text == "CE":
self.entry_var.set("")
self.history = []
elif button_text == "删除":
self.entry_var.set(current_text[:-1])
elif button_text == "=":
try:
result = str(eval(current_text))
self.history.append(f"{current_text} = {result}")
self.entry_var.set(result)
except Exception:
self.entry_var.set("Error")
elif button_text == "±":
if current_text.startswith("-"):
self.entry_var.set(current_text[1:])
else:
self.entry_var.set("-" + current_text)
elif button_text == "1/x":
try:
result = str(1 / float(current_text))
self.entry_var.set(result)
except Exception:
self.entry_var.set("Error")
elif button_text == "平方":
try:
result = str(float(current_text) ** 2)
self.entry_var.set(result)
except Exception:
self.entry_var.set("Error")
elif button_text == "√":
try:
result = str(float(current_text) ** 0.5)
self.entry_var.set(result)
except Exception:
self.entry_var.set("Error")
else:
self.entry_var.set(current_text + button_text)
实现查看历史记录、当前日期时间及开发者信息的功能。
def show_history(self):
history_window = Toplevel(self.root)
history_window.title("历史记录")
history_window.geometry("320x420")
history_text = Text(history_window, wrap="word")
history_text.pack(expand=1, fill="both")
for record in self.history:
history_text.insert("end", record + "\n")
def show_date(self):
current_date = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
messagebox.showinfo("当前日期和时间", current_date)
def show_developer(self):
messagebox.showinfo("开发者信息", "开发者: Your Name")
运行主程序,启动计算器
if __name__ == "__main__":
root = ttk.Window(themename="darkly")
calculator = Calculator(root)
root.mainloop()
import ttkbootstrap as ttk
from ttkbootstrap.constants import *
from tkinter import StringVar, Text, Menu, Toplevel, messagebox, simpledialog
import datetime
class Calculator:
def __init__(self, root):
self.root = root
self.root.title("计算器")
self.root.geometry("320x420")
self.root.resizable(False, False)
self.entry_var = StringVar()
self.history = []
self.create_menu()
self.create_widgets()
def create_menu(self):
menubar = Menu(self.root)
# 历史记录菜单
history_menu = Menu(menubar, tearoff=0)
history_menu.add_command(label="查看历史记录", command=self.show_history)
menubar.add_cascade(label="历史记录", menu=history_menu)
# 查看菜单
view_menu = Menu(menubar, tearoff=0)
view_menu.add_command(label="查看日期", command=self.show_date)
view_menu.add_command(label="查看开发者", command=self.show_developer)
menubar.add_cascade(label="查看", menu=view_menu)
# 修改菜单
edit_menu = Menu(menubar, tearoff=0)
# 修改主题子菜单
theme_menu = Menu(edit_menu, tearoff=0)
style = ttk.Style()
theme_names = style.theme_names() # 以列表的形式返回多个主题名
for theme_name in theme_names:
theme_menu.add_command(label=theme_name, command=lambda t=theme_name: self.change_theme(t))
edit_menu.add_cascade(label="修改主题", menu=theme_menu)
# 修改窗口大小功能
edit_menu.add_command(label="修改窗口大小", command=self.change_window_size)
menubar.add_cascade(label="修改", menu=edit_menu)
self.root.config(menu=menubar)
def change_theme(self, theme_name):
style = ttk.Style()
style.theme_use(theme_name)
def change_window_size(self):
size = simpledialog.askstring("设置窗口大小", "请输入窗口大小(如800x600):")
if size:
self.root.geometry(size)
def create_widgets(self):
# 显示结果和输入的只读文本框
entry = ttk.Entry(self.root, textvariable=self.entry_var, font=("Helvetica", 16), justify="right", state="readonly")
entry.grid(row=0, column=0, columnspan=5, sticky="nsew", ipadx=8, ipady=8, padx=10, pady=10)
# 定义按钮
buttons = [
'7', '8', '9', '/', 'C',
'4', '5', '6', '*', '删除',
'1', '2', '3', '-', '±',
'0', '.', '=', '+', 'CE',
'√', '平方', '1/x'
]
# 创建按钮并添加到窗口中
for i, button in enumerate(buttons):
if button != ' ':
b = ttk.Button(self.root, text=button, bootstyle=SUCCESS if button == '=' else PRIMARY, command=lambda b=button: self.button_press(b))
b.grid(row=i//5 + 1, column=i%5, sticky="nsew", padx=5, pady=5)
# 设置网格权重
for i in range(5):
self.root.columnconfigure(i, weight=1)
for i in range(6):
self.root.rowconfigure(i + 1, weight=1)
def button_press(self, button_text):
current_text = self.entry_var.get()
if button_text == "C":
self.entry_var.set("")
elif button_text == "CE":
self.entry_var.set("")
self.history = []
elif button_text == "删除":
self.entry_var.set(current_text[:-1])
elif button_text == "=":
try:
result = str(eval(current_text))
self.history.append(f"{current_text} = {result}")
self.entry_var.set(result)
except Exception:
self.entry_var.set("Error")
elif button_text == "±":
if current_text.startswith("-"):
self.entry_var.set(current_text[1:])
else:
self.entry_var.set("-" + current_text)
elif button_text == "1/x":
try:
result = str(1 / float(current_text))
self.entry_var.set(result)
except Exception:
self.entry_var.set("Error")
elif button_text == "平方":
try:
result = str(float(current_text) ** 2)
self.entry_var.set(result)
except Exception:
self.entry_var.set("Error")
elif button_text == "√":
try:
result = str(float(current_text) ** 0.5)
self.entry_var.set(result)
except Exception:
self.entry_var.set("Error")
else:
self.entry_var.set(current_text + button_text)
def show_history(self):
history_window = Toplevel(self.root)
history_window.title("历史记录")
history_window.geometry("320x420")
history_text = Text(history_window, wrap="word")
history_text.pack(expand=1, fill="both")
for record in self.history:
history_text.insert("end", record + "\n")
def show_date(self):
current_date = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
messagebox.showinfo("当前日期和时间", current_date)
def show_developer(self):
messagebox.showinfo("开发者信息", "开发者: B站 优秀稳妥的小光")
if __name__ == "__main__":
root = ttk.Window(themename="darkly")
calculator = Calculator(root)
root.mainloop()
本项目展示了如何使用ttkbootstrap模块创建一个功能齐全且美观的计算器应用程序。通过菜单栏提供的各种功能,用户可以方便地进行主题切换、窗口大小调整、查看历史记录和其他信息等操作。这不仅提高了计算器的实用性,也增强了用户体验。