作者 主题: Python菜鸟Tkinter学习结业笔记  (阅读 352 次)

hotpower

  • 管理员
  • Full Member
  • *****
  • 帖子: 134
Python菜鸟Tkinter学习结业笔记
« 于: 十二月 21, 2019, 01:58:24 上午 »
程序代码: [选择]
# -*- coding:utf-8 -*-
#Python菜鸟Tkinter学习结业笔记
#菜农HotPower@163.com 2019.4.17于西安雁塔菜地
from tkinter import *
import random
class Application:
    def __init__(self):
        self.root = Tk()
        self.root.title("80位二进制数转换为25位BCD码")
        Label(self.root, text = "10字节BIN").grid(row = 0, column = 0)
        self.binstr = StringVar()
        Entry(self.root, bd = 4, textvariable = self.binstr, width = 40).grid(row = 0, column = 1)
        Button(self.root, text = "清空", command = self.ClsBin).grid(row = 0, column = 2)
        Button(self.root, text = "BIN2BCD", command = self.BinToBcd).grid(row = 0, column = 3)
        Label(self.root, text = "13字节BCD").grid(row = 1, column = 0)
        self.bcdstr = StringVar()
        Entry(self.root, bd= 4, textvariable = self.bcdstr, width = 40).grid(row = 1, column = 1)
        Button(self.root, text = "清空", command = self.ClsBcd).grid(row = 1, column = 2)
        Button(self.root, text = "BCD2BIN", command = self.BcdToBin).grid(row = 1, column = 3)
        self.check = BooleanVar()
        self.check.set(TRUE)#默认标准算法
        Checkbutton(self.root, text = "标准算法", variable = self.check).grid(row = 2, column = 0)
        Label(self.root, text="运算次数").grid(row=2, column=1)
        self.countstr = StringVar()
        Entry(self.root, bd = 4, textvariable=self.countstr, width = 5).grid(row=2, column=2)
        Button(self.root, text = "随机数", command = self.Random).grid(row = 2, column = 3)
        self.Random()
        self.SubCount = 0
        #模拟两个数组
        self.binarray = [0] * 3
        self.bcdarray = [0] * 13
        #构造25组10进制数
        self.decarray = [
        [0] * 3, [0] * 3, [0] * 3, [0] * 3, [0] * 3,
        [0] * 3, [0] * 3, [0] * 3, [0] * 3, [0] * 3,
        [0] * 3, [0] * 3, [0] * 3, [0] * 3, [0] * 3,
        [0] * 3, [0] * 3, [0] * 3, [0] * 3, [0] * 3,
        [0] * 3, [0] * 3, [0] * 3, [0] * 3, [0] * 3
        ]
        for i in range(25):
            x = 10 ** i
            self.decarray[i][0] = x >> 64
            self.decarray[i][1] = (x >> 32) & 0xffffffff
            self.decarray[i][2] = x & 0xffffffff
    def TestBinData(self, index):
        #比较self.binarray[0-2]和self.decarray[index][0-2]
        result = FALSE
        if self.binarray[0] == self.decarray[index][0]:
            if self.binarray[1] == self.decarray[index][1]:
                if self.binarray[2] >= self.decarray[index][2]:
                    result = TRUE
            elif self.binarray[1] > self.decarray[index][1]:
                result = TRUE
        elif self.binarray[0] > self.decarray[index][0]:
            result = TRUE
        return result
    def TestBcdData(self, index):
        #比较self.bcdarray[0-12],index=0-25
        result = FALSE
        x = index >> 1
        if index & 1 == 0:
            if self.bcdarray[x] & 0xf0:
                result = TRUE
        else:
            if self.bcdarray[x] & 0x0f:
                result = TRUE
        return result
    def SubBinData(self, index):
        # self.binarray[0-2]减self.decarray[index][0-2]
        if self.binarray[2] < self.decarray[index][2]:
            if self.binarray[1] == 0:
                self.binarray[0] -= 1
                self.binarray[0] &= 0xffff
            self.binarray[1] -= 1
            self.binarray[1] &= 0xffffffff
        self.binarray[2] -= self.decarray[index][2]
        self.binarray[2] &= 0xffffffff
        if self.binarray[1] < self.decarray[index][1]:
            self.binarray[0] -= 1
            self.binarray[0] &= 0xffff
        self.binarray[1] -= self.decarray[index][1]
        self.binarray[1] &= 0xffffffff
        self.binarray[0] -= self.decarray[index][0]
        self.binarray[0] &= 0xffff
    def AddBinData(self, index):
        # self.binarray[0-2]加self.decarray[index][0-2]
        index = 25 - index
        if self.binarray[2] > (self.binarray[2] + self.decarray[index][2]) & 0xffffffff:
            if self.binarray[1] == 0xffffffff:
                self.binarray[0] += 1
                self.binarray[0] &= 0xffff
            self.binarray[1] += 1
            self.binarray[1] &= 0xffffffff
        self.binarray[2] += self.decarray[index][2]
        self.binarray[2] &= 0xffffffff
        if self.binarray[1] > (self.binarray[1] + self.decarray[index][1]) & 0xffffffff:
            self.binarray[0] += 1
            self.binarray[0] &= 0xffff
        self.binarray[1] += self.decarray[index][1]
        self.binarray[1] &= 0xffffffff
        self.binarray[0] += self.decarray[index][0]
        self.binarray[0] &= 0xffff
    def AddBcdData(self, index):
        x = index >> 1
        if index & 1 == 0:
            self.bcdarray[x] += 0x01
        else:
            self.bcdarray[x] += 0x10
    def SubBcdData(self, index):
        x = index >> 1
        if index & 1 == 0:
            self.bcdarray[x] -= 0x10
        else:
            self.bcdarray[x] -= 0x01
    def Bin10ToBcd13(self, binstr):
        for i in range(0, 13):
            self.bcdarray[i] = 0#清空BCD区域
        x =  self.hextoint(binstr)#取出面板上的数据
        self.binarray[0] = x >> 64#存入BIN16
        self.binarray[1] = (x >> 32) & 0xffffffff#存入BIN32
        self.binarray[2] = x & 0xffffffff#存入BIN32
        count = 0#算法使用次数为0
        for i in range(24, -1, -1):
            while self.TestBinData(i):#BCD>=10**i
                self.SubBinData(i)#做一次减法运算
                self.AddBcdData(i)#BCD对应位+1,即构造10进制数
                count += 1#算法使用次数
        self.countstr.set(count)
        bcdstr = ""
        for i in range(12, -1, -1):
            bcdstr += self.inttohex(self.bcdarray[i], 2)
        return bcdstr
    def Bcd13ToBin10(self, bcdstr):
        for i in range(0, 3):
            self.binarray[i] = 0#清空BIN区域
        for i in range(0, 13):
            self.bcdarray[i] = self.hextoint(bcdstr[i*2:i*2+2])# 取出面板上的数据
        count = 0  # 算法使用次数为0
        for i in range(0, 26):
            while self.TestBcdData(i):#BCD>=10**i
                self.AddBinData(i)#做一次加法运算
                self.SubBcdData(i)#BCD对应位1,即构造10进制数
                count += 1#算法使用次数
        self.countstr.set(count)
        binstr = self.inttohex(self.binarray[0], 4)
        binstr += self.inttohex(self.binarray[1], 8)
        binstr += self.inttohex(self.binarray[2], 8)
        return binstr
    def BinToBcd(self):
        binstr = self.binstr.get()
        bcd = self.hextoint(binstr)
        if self.check.get():
            #标准算法
            bcdstr = "{:>0{}d}".format(bcd, 26)[-26:]
        else:
            # 折腾算法
            bcdstr = self.Bin10ToBcd13(binstr)
        self.bcdstr.set(bcdstr)
    def BcdToBin(self):
        bcdstr = self.bcdstr.get()
        bcd = int(bcdstr)
        if self.check.get():
            # 标准算法
            binstr = self.inttohex(bcd, 20)
        else:
            # 折腾算法
            binstr = self.Bcd13ToBin10(bcdstr)
        self.binstr.set(binstr)
    def ClsBin(self):
        self.binstr.set("")
    def ClsBcd(self):
        self.bcdstr.set("")
    def Random(self):
        x = random.randint(1, 2 ** 80)
        bin = self.inttohex(x, 20)
        bcd = self.inttostr(x, 26)
        self.binstr.set(bin)
        self.bcdstr.set(bcd)
    def inttostr(self, val, size):
        return "{:>0{}d}".format(val, size)[-size:]
    def inttohex(self, val, size):
        return "{:>0{}X}".format(val, size)[-size:]
    def hextoint(self, string):
        return int(string, 16)
    def main(self):
        self.root.mainloop()
if __name__ == "__main__":
    app = Application()
    app.main()