# File: upc.py # based on differences.py from Tkinter import * master = Tk() bigfont = "Helvetica 24" barWidth = 5 barHeight = 200 digFont = "Helvetica 48" digWidth = 30 digHeight = 40 # manu[facturer] (6 digits) # item (5 digits) # compute check def checkDigit(first,second): (d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11) = [int(s) for s in first+second] step1 = (d1+d3+d5+d7+d9+d11)*3 step2 = step1+d2+d4+d6+d8+d10 step3 = (-step2)%10 return str(step3) bitPats = ["0001101", "0011001", "0010011", "0111101", "0100011", "0110001", "0101111", "0111011", "0110111", "0001011"] def flipBit(bit): if bit == "0": return "1" return "0" def flipString(bitString): return "".join([flipBit(bit) for bit in bitString]) # run the engine def makeCode(event): firstBlock = manuIn.get() if len(firstBlock) != 6: firstBlock = "000000" manuIn.delete(0,END) manuIn.insert(INSERT, firstBlock) # secondBlock = itemIn.get() if len(secondBlock) != 5: secondBlock = "00000" itemIn.delete(0,END) itemIn.insert(INSERT, secondBlock) # checkBlock = checkDigit(firstBlock,secondBlock) # allBits = "101"+"".join([bitPats[int(i)] for i in firstBlock]) print allBits allBits = allBits+"01010"+"".join([flipString(bitPats[int(i)]) for i in secondBlock+checkBlock])+"101" print firstBlock, secondBlock, checkBlock print allBits # for i in range(len(allBits)): if allBits[i] == "1": codeOut.create_rectangle(digWidth+i*barWidth, 0, digWidth+(i+1)*barWidth, barHeight, fill="black",tags="bar",width=0) if allBits[i] == "0": codeOut.create_rectangle(digWidth+i*barWidth, 0, digWidth+(i+1)*barWidth, barHeight, fill="white",tags="bar",width=0) # codeOut.create_rectangle(digWidth+barWidth*10,barHeight-digHeight*1.25,digWidth+barWidth*10+barWidth*7*5,barHeight,fill="white",tag="back",width=0) codeOut.create_rectangle(digWidth+barWidth*14+barWidth*7*5,barHeight-digHeight*1.25,digWidth+barWidth*14+barWidth*7*10,barHeight,fill="white",tag="back",width=0) # codeOut.delete("dig") drawDig(-1,firstBlock[0]) for i in [1,2,3,4,5]: drawDig(1+i,firstBlock[i]) for i in [0,1,2,3,4]: drawDig(9+i,secondBlock[i]) drawDig(16,checkBlock) def drawDig(pos,dig): digOffset = barHeight - digHeight/2 digShift = digWidth/2 codeOut.create_text(digShift+(1+pos)*digWidth,digOffset,text=dig,tag="dig",font=digFont) # Start widgets manuLb = Label(master, text="Manufacturer (6 digits)", font=bigfont) manuLb.grid(row=0,column=0) manuIn = Entry(master, width=6, font=bigfont) manuIn.grid(row=0,column=1) manuIn.bind('',makeCode) itemLb = Label(master, text="Item code (5 digits)", font=bigfont) itemLb.grid(row=0,column=2) itemIn = Entry(master, width=5, font=bigfont) itemIn.grid(row=0,column=3) itemIn.bind('',makeCode) codeOut = Canvas(master, width=barWidth*95+2*digWidth, height=barHeight) codeOut.grid(row=1,column=0,columnspan=4) makeCode(0) master.mainloop() # 0016600000708