Python小工具——格雷码转换器

本文介绍了一款基于Python的格雷码与二进制码互转工具,使用Tkinter创建图形界面,适用于各种长度的输入,提高了工程应用中的容错率和精度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

介绍:

格雷码在光电编码器、步进电机等工程应用中使用比较广泛。相较于原始的二进制码,在工程使用中容错率和精度都要高出许多,具体详见:https://baike.baidu.com/item/%E6%A0%BC%E9%9B%B7%E7%A0%81/6510858?fr=aladdin

小编制作的格雷码转化器使用字符串进行操作,故对输入长度没有太大限制。

效果如下图所示:

不废话了,以下是代码:

#!/usr/bin/python # -*- coding: UTF-8 -*-

from tkinter import *
from tkinter import scrolledtext,messagebox
import re

win_main = Tk()
win_main["background"] = "gray"
win_main["width"] = 1000
win_main["height"] = 600
win_main.title("格雷码转换器")
win_main.resizable(FALSE, FALSE)


lbl_Binary_Title = Label(win_main, justify=LEFT)
lbl_Binary_Title['text'] = '普通二进制码'
lbl_Binary_Title['background'] = "white"
lbl_Binary_Title.place(width=300, height=25, x=100, y=100)

stxt_Binary_InOut = scrolledtext.ScrolledText(win_main)
stxt_Binary_InOut.place(width=300, height=375, x=100, y=125)

lbl_Gray_Title = Label(win_main, justify=LEFT)
lbl_Gray_Title['text'] = '格雷码'
lbl_Gray_Title['background'] = "white"
lbl_Gray_Title.place(width=300, height=25, x=600, y=100)

stxt_Gray_InOut = scrolledtext.ScrolledText(win_main)
stxt_Gray_InOut.place(width=300, height=375, x=600, y=125)

def cmd_BinaryToGray():
    b_data=stxt_Binary_InOut.get(0.0,END).strip()
    # print(type(b_data),len(b_data))
    regex = re.compile('[10]+')
    if regex.fullmatch(b_data)==None:
        messagebox.showinfo('注意','二进制输入格式错误!')
        return
    g_data = b_data[0]
    for i in range(len(b_data) - 1):
        if b_data[i]==b_data[i + 1]:
            g_data += '0'
        else:
            g_data += '1'
    stxt_Gray_InOut.delete(0.0,END)
    stxt_Gray_InOut.insert(END,g_data)
    return
btn_BinaryToGray = Button(win_main, justify=CENTER, text="——>", command=cmd_BinaryToGray)
btn_BinaryToGray.place(width=180, height=50, x=410, y=200)

def cmd_GrayToBinary():
    g_data = stxt_Gray_InOut.get(0.0, END).strip()
    regex = re.compile('[10]+')
    if regex.fullmatch(g_data) == None:
        messagebox.showinfo('注意', '格雷码输入格式错误!')
        return
    b_data = g_data[0]
    for i in range(len(g_data) - 1):
        if b_data[i] == g_data[i + 1]:
            b_data += '0'
        else:
            b_data += '1'
    stxt_Binary_InOut.delete(0.0, END)
    stxt_Binary_InOut.insert(END, b_data)
    return
btn_GrayToBinary = Button(win_main, justify=CENTER, text="<——", command=cmd_GrayToBinary)
btn_GrayToBinary.place(width=180, height=50, x=410, y=350)

win_main.mainloop()

 

二进制转格雷码 格雷码转二进制 十进制转二进制 二进制转十进制等,在Delphi xe2下通过测试。格雷码(英文:Gray Code, Grey Code,又称作葛莱码,二进制循环码)是1880年由法国工程师Jean-Maurice-Emlle Baudot发明的一种编码[,因Frank Gray于1953年申请专利“Pulse Code Communication”得名。当初是为了机械应用,后来在电报上取得了巨大发展.压缩包里含该源代码. 二进制和格雷码转换: 最佳答案: 十进制 586 = 二进制 1001001010 = 格雷码 1101101111。 二进制码 ----> 格雷码(编码): 从最右边一位起,依次将每一位与左边一位异或(XOR),作为对应格雷码该位的值,最左边一位不变(相当于左边是0)。 格雷码的特点是: 相邻两数的格雷码,仅仅有一位二进制发生变化。 而且在其范围内的最小值和最大值,也仅仅有一位二进制发生变化。 例如下面两数: 最小:二进制0000=格雷码0000 最大:二进制1111=格雷码1000 看到了吧,0000 和 1000,仅仅有一位数发生变化。 ------- 如果在变换的过程中,先把十进制转换成BCD码,这就失去了格雷码的特点。 因为在BCD码中: 最小:二进制0000=格雷码0000 最大:二进制1001=格雷码1101 可以看出,它们之间有三位发生变化。 通过BCD码来变换格雷码,思路不对。变换出来的,并不是原数的格雷码。 自然二进制数与格雷码的互换公式与电路: 自然二进制数转换到格雷码 ------------ 设有 N 位二进制数 B(i),其中 0 <= i <= N - 1;它可以变换成为同样位数的格雷码 G(i)。 二进制数与格雷码的转换公式如下:   G(i) = B(i 1) XOR B(i) ; 0 <= i < N - 1   G(i) = B(i) ; i = N - 1 如果是通过编程计算进行变换,就需要使用这个公式逐位的计算; 如果是使用硬件电路进行变换,就可以使用做而论道前面在回答问题时给出的电路。 格雷码转换到自然二进制数 ------------ 设有 N 位格雷码 G(i),把它转换成自然二进制数的算法如下。 自然二进制码的最高位等于雷码的最高位; 自然二进制码的次高位为最高位自然二进制码与次高位格雷码相异或; 自然二进制码的其余各位与次高位自然二进制码的求法相类似。 转换公式如下:   B(i) = G(i) ; i = N - 1   B(i) = B(i 1) XOR G(i) ; 0 <= i < N - 1 二进制格雷码转换器截图:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值