Python結合Tkinter手搓一個寄存器計算器
專業(yè)的32位寄存器計算工具,為程序員和硬件工程師設計
軟件概述
寄存器計算器(Register Calculator)是一款專業(yè)的32位寄存器計算工具,專為程序員和硬件工程師設計, 提供直觀的位操作和進制轉(zhuǎn)換功能,幫助用戶快速進行寄存器配置和位級操作。
核心功能
1.32位寄存器位操作
通過點擊按鈕直接切換寄存器各位的值(0/1),按每4位一組進行分組顯示,符合16進制顯示習慣,位值變化時實時更新所有顯示。
2.多進制轉(zhuǎn)換
支持16進制、10進制、2進制三種進制,修改任一進制值時,其他進制值自動更新,可直接復制不同進制的結果到剪貼板。
3.窗口控制
可將窗口固定在屏幕最上層,方便在其他應用程序上操作,窗口大小可調(diào)整,適應不同屏幕分辨率。
界面設計
現(xiàn)代專業(yè)風格
采用專業(yè)的深藍色系作為主色調(diào),搭配柔和的背景色,通過分組顯示、分隔符和適當?shù)拈g距創(chuàng)建清晰的視覺層次, 默認窗口大小(900x500)確保所有內(nèi)容完全顯示,無需調(diào)整。
功能區(qū)域劃分
寄存器位顯示區(qū):32位寄存器的可視化操作界面,按每4位一組分組顯示
進制轉(zhuǎn)換顯示區(qū):顯示和編輯不同進制的值,支持實時轉(zhuǎn)換
交互體驗
通過點擊按鈕切換位值,操作簡單直觀,位值變化時立即更新所有顯示,提供即時視覺反饋, 符合程序員的審美習慣,界面整潔有序。
技術實現(xiàn)
開發(fā)語言與庫
- 編程語言:Python
- GUI庫:Tkinter和ttk模塊
- 布局管理:grid布局管理器
核心技術特點
- 面向?qū)ο笤O計
- 實時狀態(tài)同步
- 事件驅(qū)動架構
代碼結構
- 模塊化設計
- 可維護性高
- 易于擴展
效果圖

源代碼
import tkinter as tk
from tkinter import ttk
# 定義顏色主題 - 優(yōu)化配色方案
class Colors:
# 主色調(diào) - 專業(yè)深藍色系
PRIMARY = "#2c3e50" # 主深藍色
PRIMARY_DARK = "#1a252f" # 深藍色
PRIMARY_LIGHT = "#34495e" # 淺藍色
# 功能色
SUCCESS = "#27ae60" # 綠色
WARNING = "#f39c12" # 橙色
ERROR = "#e74c3c" # 紅色
INFO = "#3498db" # 信息藍
# 背景色
BACKGROUND = "#f5f7fa" # 柔和淺灰背景
CARD_BG = "#ffffff" # 卡片背景
FRAME_BG = "#ffffff" # 框架背景
# 文本色
TEXT_PRIMARY = "#2c3e50" # 主文本色
TEXT_SECONDARY = "#6c757d" # 次要文本色
TEXT_LIGHT = "#ffffff" # 亮色文本
# 寄存器位顏色
BIT_ACTIVE = "#4361ee" # 激活位 - 專業(yè)藍紫色
BIT_INACTIVE = "#e9ecef" # 未激活位 - 柔和淺灰色
BIT_HOVER = "#dee2e6" # 懸停位 - 淺灰色
# 邊框色
BORDER = "#dee2e6" # 邊框
BORDER_LIGHT = "#f8f9fa" # 淺色邊框
# 按鈕色
BUTTON_BG = "#4361ee" # 按鈕背景
BUTTON_HOVER = "#3a0ca3" # 按鈕懸停
BUTTON_TEXT = "#ffffff" # 按鈕文本
class RegisterCalculator:
def __init__(self, root):
self.root = root
self.root.title("寄存器計算器")
self.root.geometry("800x400")
self.root.resizable(True, True)
# 設置背景顏色
self.root.configure(bg=Colors.BACKGROUND)
# 初始化寄存器值
self.register_value = 0
# 創(chuàng)建主框架
self.main_frame = ttk.Frame(root, padding="20")
self.main_frame.pack(fill=tk.BOTH, expand=True)
# 創(chuàng)建寄存器位顯示區(qū)域
self.create_register_display()
# 創(chuàng)建進制顯示區(qū)域
self.create_conversion_display()
# 控制區(qū)域已移除
# 初始化顯示
self.update_display()
def create_register_display(self):
"""創(chuàng)建寄存器位顯示區(qū)域"""
register_frame = ttk.LabelFrame(self.main_frame, text="32位寄存器", padding="15")
register_frame.pack(fill=tk.X, pady=10)
# 創(chuàng)建位標題行和值行的容器
bits_frame = ttk.Frame(register_frame)
bits_frame.pack(fill=tk.X, pady=5)
# 第一組 (31-16)
group1_frame = ttk.Frame(bits_frame)
group1_frame.pack(fill=tk.X, pady=2)
self.bit_buttons1 = []
col = 0
for i, bit_idx in enumerate(range(31, 15, -1)):
# 每4位添加一個分隔符
if i > 0 and i % 4 == 0:
# 添加空白列作為分隔符
spacer = ttk.Label(group1_frame, text="", width=2)
spacer.grid(row=0, column=col, rowspan=2, padx=2)
col += 1
# 位標題
bit_label = ttk.Label(group1_frame, text=str(bit_idx), width=4, anchor="center",
background=Colors.CARD_BG, foreground=Colors.TEXT_SECONDARY,
font=('Consolas', 9, 'bold'))
bit_label.grid(row=0, column=col, padx=1, pady=1, sticky=tk.NSEW)
# 位值按鈕
bit_var = tk.StringVar(value="0")
bit_button = ttk.Button(
group1_frame,
width=4,
textvariable=bit_var,
command=lambda idx=bit_idx, var=bit_var: self.update_bit(idx, var),
style="BitButton.TButton"
)
bit_button.grid(row=1, column=col, padx=1, pady=1, sticky=tk.NSEW)
self.bit_buttons1.append((bit_idx, bit_var, bit_button))
col += 1
# 第二組 (15-0)
group2_frame = ttk.Frame(bits_frame)
group2_frame.pack(fill=tk.X, pady=2)
self.bit_buttons2 = []
col = 0
for i, bit_idx in enumerate(range(15, -1, -1)):
# 每4位添加一個分隔符
if i > 0 and i % 4 == 0:
# 添加空白列作為分隔符
spacer = ttk.Label(group2_frame, text="", width=2)
spacer.grid(row=0, column=col, rowspan=2, padx=2)
col += 1
# 位標題
bit_label = ttk.Label(group2_frame, text=str(bit_idx), width=4, anchor="center",
background=Colors.CARD_BG, foreground=Colors.TEXT_SECONDARY,
font=('Consolas', 9, 'bold'))
bit_label.grid(row=0, column=col, padx=1, pady=1, sticky=tk.NSEW)
# 位值按鈕
bit_var = tk.StringVar(value="0")
bit_button = ttk.Button(
group2_frame,
width=4,
textvariable=bit_var,
command=lambda idx=bit_idx, var=bit_var: self.update_bit(idx, var),
style="BitButton.TButton"
)
bit_button.grid(row=1, column=col, padx=1, pady=1, sticky=tk.NSEW)
self.bit_buttons2.append((bit_idx, bit_var, bit_button))
col += 1
def create_conversion_display(self):
"""創(chuàng)建進制轉(zhuǎn)換顯示區(qū)域"""
conversion_frame = ttk.LabelFrame(self.main_frame, text="進制轉(zhuǎn)換", padding="15")
conversion_frame.pack(fill=tk.X, pady=10)
# 16進制輸入
ttk.Label(conversion_frame, text="16進制:", width=10, foreground=Colors.TEXT_PRIMARY,
font=('Arial', 10, 'bold')).grid(row=0, column=0, padx=10, pady=8, sticky=tk.W)
self.hex_var = tk.StringVar(value="0x00000000")
hex_entry = ttk.Entry(conversion_frame, textvariable=self.hex_var, width=30,
font=('Consolas', 10))
hex_entry.grid(row=0, column=1, padx=10, pady=8, sticky=tk.EW)
hex_entry.bind("<Return>", lambda e: self.update_from_hex())
# 10進制顯示
ttk.Label(conversion_frame, text="10進制:", width=10, foreground=Colors.TEXT_PRIMARY,
font=('Arial', 10, 'bold')).grid(row=0, column=2, padx=10, pady=8, sticky=tk.W)
self.dec_var = tk.StringVar(value="0")
dec_entry = ttk.Entry(conversion_frame, textvariable=self.dec_var, width=30,
font=('Consolas', 10))
dec_entry.grid(row=0, column=3, padx=10, pady=8, sticky=tk.EW)
dec_entry.bind("<Return>", lambda e: self.update_from_dec())
# 2進制顯示
ttk.Label(conversion_frame, text="2進制:", width=10, foreground=Colors.TEXT_PRIMARY,
font=('Arial', 10, 'bold')).grid(row=1, column=0, padx=10, pady=8, sticky=tk.W)
self.bin_var = tk.StringVar(value="0000 0000 0000 0000 0000 0000 0000 0000")
bin_entry = ttk.Entry(conversion_frame, textvariable=self.bin_var, width=50,
font=('Consolas', 10))
bin_entry.grid(row=1, column=1, columnspan=2, padx=10, pady=8, sticky=tk.EW)
# 最上端顯示復選框 - 與2進制在同一行
self.topmost_var = tk.BooleanVar(value=False)
ttk.Checkbutton(conversion_frame, text="最上端顯示", variable=self.topmost_var,
command=self.toggle_topmost, style="Modern.TCheckbutton").grid(
row=1, column=3, padx=10, pady=8, sticky=tk.E)
# 設置列權重,使輸入框能夠擴展
conversion_frame.columnconfigure(1, weight=1)
conversion_frame.columnconfigure(3, weight=1)
def update_bit(self, bit_index, bit_var):
"""更新指定位的值"""
# 切換位值
current_value = bit_var.get()
new_value = "1" if current_value == "0" else "0"
bit_var.set(new_value)
# 更新寄存器值
if new_value == "1":
self.register_value |= (1 << bit_index)
else:
self.register_value &= ~(1 << bit_index)
# 更新顯示
self.update_display()
def update_from_hex(self):
"""從16進制輸入更新寄存器值"""
try:
hex_str = self.hex_var.get().strip()
# 處理前綴
if hex_str.startswith("0x"):
hex_str = hex_str[2:]
# 轉(zhuǎn)換為整數(shù)
self.register_value = int(hex_str, 16)
# 確保值在32位范圍內(nèi)
self.register_value &= 0xFFFFFFFF
# 更新顯示
self.update_display()
except ValueError:
# 輸入無效,恢復之前的值
self.hex_var.set(f"0x{self.register_value:08X}")
def update_from_dec(self):
"""從10進制輸入更新寄存器值"""
try:
dec_str = self.dec_var.get().strip()
# 轉(zhuǎn)換為整數(shù)
self.register_value = int(dec_str)
# 確保值在32位范圍內(nèi)
self.register_value &= 0xFFFFFFFF
# 更新顯示
self.update_display()
except ValueError:
# 輸入無效,恢復之前的值
self.dec_var.set(str(self.register_value))
def toggle_topmost(self):
"""切換窗口是否顯示在最上端"""
self.root.attributes("-topmost", self.topmost_var.get())
def update_display(self):
"""更新所有顯示"""
# 更新位按鈕狀態(tài)
for bit_info in self.bit_buttons1 + self.bit_buttons2:
bit_index, bit_var, bit_button = bit_info
bit_value = (self.register_value >> bit_index) & 1
bit_var.set(str(bit_value))
# 更新按鈕樣式
if bit_value:
# 為1的位使用不同的顏色
bit_button.configure(style="ActiveBit.TButton")
else:
# 為0的位使用默認顏色
bit_button.configure(style="InactiveBit.TButton")
# 更新16進制顯示
self.hex_var.set(f"0x{self.register_value:08X}")
# 更新10進制顯示
self.dec_var.set(str(self.register_value))
# 更新2進制顯示
bin_str = f"{self.register_value:032b}"
# 添加空格分隔
formatted_bin = " ".join([bin_str[i:i+4] for i in range(0, 32, 4)])
self.bin_var.set(formatted_bin)
if __name__ == "__main__":
root = tk.Tk()
# 創(chuàng)建自定義樣式
style = ttk.Style()
# 基礎位按鈕樣式
style.configure("BitButton.TButton",
width=5,
padding=4,
font=('Consolas', 10, 'bold'))
# 活動狀態(tài)的位按鈕樣式(值為1)
style.configure("ActiveBit.TButton",
background=Colors.BIT_ACTIVE,
foreground=Colors.TEXT_PRIMARY,
relief="raised")
# 非活動狀態(tài)的位按鈕樣式(值為0)
style.configure("InactiveBit.TButton",
background=Colors.BIT_INACTIVE,
foreground=Colors.TEXT_PRIMARY,
relief="sunken")
# 現(xiàn)代復選框樣式
style.configure("Modern.TCheckbutton",
padding=5,
font=('Arial', 10))
# 標簽樣式
style.configure("TLabel",
background=Colors.FRAME_BG,
foreground=Colors.TEXT_PRIMARY)
# 輸入框樣式
style.configure("TEntry",
fieldbackground=Colors.CARD_BG,
foreground=Colors.TEXT_PRIMARY,
padding=4,
borderwidth=1,
relief="solid")
# 框架樣式
style.configure("TLabelframe",
background=Colors.FRAME_BG,
foreground=Colors.PRIMARY,
borderwidth=1,
relief="solid")
style.configure("TLabelframe.Label",
background=Colors.FRAME_BG,
foreground=Colors.PRIMARY,
font=("Arial", 11, "bold"),
padding=(5, 0, 5, 10))
# 主窗口樣式
root.configure(bg=Colors.BACKGROUND)
app = RegisterCalculator(root)
root.mainloop()
到此這篇關于Python結合Tkinter手搓一個寄存器計算器的文章就介紹到這了,更多相關Python計算器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
使用Python的Tornado框架實現(xiàn)一個Web端圖書展示頁面
Tornado是Python的一款高人氣Web開發(fā)框架,這里我們來展示使用Python的Tornado框架實現(xiàn)一個Web端圖書展示頁面的實例,通過該實例可以清楚地學習到Tornado的模板使用及整個Web程序的執(zhí)行流程.2016-07-07
關于Tensorflow和Keras版本對照及環(huán)境安裝
這篇文章主要介紹了關于Tensorflow和Keras版本對照及環(huán)境安裝方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-08-08
python中數(shù)字列表轉(zhuǎn)化為數(shù)字字符串的實例代碼
先前學習過,數(shù)字和字符串都可以存儲到變量當中,下面這篇文章主要給大家介紹了關于python中數(shù)字列表轉(zhuǎn)化為數(shù)字字符串的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2023-02-02

