介绍:
格雷码在光电编码器、步进电机等工程应用中使用比较广泛。相较于原始的二进制码,在工程使用中容错率和精度都要高出许多,具体详见: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()