Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from Tkinter import *
- from PIL import ImageTk, Image, ImageDraw, ImageFont
- import os
- class EndWindow:
- # starts on 11, 6, 12, 7, 5, 31
- def __init__(self):
- self.pics = {}
- self.record = Record.AB(5,31)
- self.squareWidth = 2
- self.buildWindow()
- self.redrawCanvas()
- def changeRecord(self,newRec):
- xn = newRec[1] + newRec[3]
- if(xn%2 == 0):
- return
- self.record = newRec
- self.redrawCanvas()
- def zoomIn(self):
- self.squareWidth += 1
- self.redrawCanvas()
- def zoomOut(self):
- self.squareWidth -= 1
- if(self.squareWidth < 1):
- self.squareWidth = 1
- self.redrawCanvas()
- def updateAB(self):
- aVal = int(self.aEntry.get())
- bVal = int(self.bEntry.get())
- self.changeRecord(Record.AB(aVal,bVal))
- self.redrawCanvas()
- def createRecord(self):
- string = self.createVar.get()
- strings, creates = Record.createStuff()
- i = strings.index(string)
- self.record = creates[i](int(self.oneEntry.get()), int(self.twoEntry.get()), int(self.threeEntry.get()))
- self.redrawCanvas()
- def redrawCanvas(self):
- #leftSide
- recString = rec2String(self.record)
- if(recString not in self.pics.keys()):
- self.pics[recString] = {}
- ww = self.squareWidth
- if(ww not in self.pics[recString]):
- IMG = generateSquare(self.record, squareWidth = ww)
- tkim = ImageTk.PhotoImage(IMG)
- self.pics[recString][ww] = tkim
- tkim = self.pics[recString][ww]
- self.canvas.delete(ALL)
- self.imagesprite = self.canvas.create_image(200,200,image=tkim)
- self.canvas.pack(side=BOTTOM)
- #rightside
- self.updateRightLabels()
- #self.root.mainloop()
- def updateRightLabels(self):
- frm = self.bottomRightFrame
- for widget in frm.winfo_children():
- widget.destroy()
- for i in range(len(Record.strs())):
- newframe = Frame(frm)
- newframe.pack(side=LEFT)
- label = Label(newframe, text=Record.strs()[i])
- value = Label(newframe, text=str(self.record.vals()[i]))
- label.pack(side=TOP)
- value.pack(side=BOTTOM)
- def upE(self,event):
- self.UPE()
- def UPE(self):
- e = self.record[0]
- n = self.record[1]
- x = self.record[3]
- newE = e + 2*n
- self.changeRecord(Record.ENX(newE, n, x))
- self.redrawCanvas()
- def downE(self,event):
- self.DOWNE()
- def DOWNE(self):
- e = self.record[0]
- n = self.record[1]
- x = self.record[3]
- newE = e - 2*n
- self.changeRecord(Record.ENX(newE, n, x))
- self.redrawCanvas()
- def minusT(self):
- e = self.record[0]
- n = self.record[1]
- x = self.record[3] - 2
- aVal = (x*x + e)*(1.0)/(2*n)
- while(aVal%1 != 0 or (x+n)%2 == 0):
- x -= 2
- aVal = (x*x + e)*(1.0)/(2*n)
- self.changeRecord(Record.ENX(e,n,x))
- self.redrawCanvas()
- def plusT(self):
- e = self.record[0]
- n = self.record[1]
- x = self.record[3] + 2
- aVal = (x*x + e)*(1.0)/(2*n)
- while(aVal%1 != 0):
- x += 2
- aVal = (x*x + e)*(1.0)/(2*n)
- self.changeRecord(Record.ENX(e,n,x))
- self.redrawCanvas()
- def WEAKFACT(self,event):
- self.weakFactor()
- def DEFACT(self,event):
- self.deFactor()
- def weakFactor(self):
- e = self.record[0]
- d = self.record[2]
- c = d*d + e
- if(c<0):
- return
- fact = self.record[4] + 1
- while(c%fact != 0):
- fact += 1
- if(fact == c):
- return
- aVal = fact
- bVal = c//fact
- if(aVal>bVal):
- return
- self.changeRecord(Record.ABD(aVal,bVal,d))
- self.redrawCanvas()
- def deFactor(self):
- e = self.record[0]
- d = self.record[2]
- c = d*d + e
- if(self.record[4] == 1):
- return
- fact = self.record[4] - 1
- while(c%fact > 0):
- fact -= 1
- bVal = c//fact
- self.changeRecord(Record.ABD(fact,bVal,d))
- self.redrawCanvas()
- def buildWindow(self):
- self.root = Tk()
- root = self.root
- root.bind('<Left>', self.downE)
- root.bind('<Right>', self.upE)
- root.bind('<Up>', self.WEAKFACT)
- root.bind('<Down>', self.DEFACT)
- self.leftFrame = Frame(root)
- self.rightFrame = Frame(root)
- self.leftFrame.pack(side=LEFT)
- self.rightFrame.pack(side=RIGHT)
- leftFrame = self.leftFrame
- rightFrame = self.rightFrame
- #left side
- self.topToolFrame = Frame(leftFrame)
- topToolFrame = self.topToolFrame
- self.ZObutton = Button(topToolFrame, text="-", command=self.zoomOut)
- self.ZIbutton = Button(topToolFrame, text="+", command=self.zoomIn)
- self.ZObutton.pack(side=LEFT)
- self.ZIbutton.pack(side=RIGHT)
- self.topToolFrame.pack(side=TOP)
- self.canvas = Canvas(leftFrame, width=400, height=400)
- IMG = generateSquare(self.record, squareWidth = self.squareWidth)
- tkim = ImageTk.PhotoImage(IMG)
- self.imagesprite = self.canvas.create_image(200,200,image=tkim)
- self.canvas.pack(side=BOTTOM)
- #right side
- #top right
- self.topRightFrame = Frame(self.rightFrame, padx = 10, pady = 10)
- self.topRightFrame.pack(side=TOP)
- self.ABLabel = Label(self.topRightFrame, text="AB:")
- self.ABLabel.pack(side=LEFT)
- self.aEntry = Entry(self.topRightFrame, width=5)
- self.aEntry.pack(side=LEFT)
- self.bEntry = Entry(self.topRightFrame, width=5)
- self.bEntry.pack(side=LEFT)
- self.ABButton = Button(self.topRightFrame, text="AB", command = self.updateAB)
- self.ABButton.pack(side=RIGHT)
- #mid right
- self.midRightFrame = Frame(self.rightFrame)
- self.midRightFrame.pack()
- listOptions, funcList = Record.createStuff()
- self.createVar = StringVar(self.midRightFrame)
- self.popMenu = OptionMenu(self.midRightFrame, self.createVar, *listOptions)
- self.popMenu.config(width = 8)
- self.popMenu.pack(side=LEFT)
- self.oneEntry = Entry(self.midRightFrame, width=5)
- self.oneEntry.pack(side=LEFT)
- self.twoEntry = Entry(self.midRightFrame, width=5)
- self.twoEntry.pack(side=LEFT)
- self.threeEntry = Entry(self.midRightFrame, width=5)
- self.threeEntry.pack(side=LEFT)
- self.CreateButton = Button(self.midRightFrame, text="Create", command = self.createRecord)
- self.CreateButton.pack(side=RIGHT)
- #bottom right
- self.bottomRightFrame = Frame(self.rightFrame)
- self.bottomRightFrame.pack(side = BOTTOM)
- self.updateRightLabels()
- #last row
- self.bottomBottomRight = Frame(self.rightFrame)
- self.bottomBottomRight.pack(side=BOTTOM)
- self.e2nButtonU = Button(self.bottomBottomRight, text="e+2n", command=self.UPE)
- self.e2nButtonU.pack(side=LEFT)
- self.e2nButtonD = Button(self.bottomBottomRight, text="e-2n", command=self.DOWNE)
- self.e2nButtonD.pack(side=LEFT)
- self.pTButton = Button(self.bottomBottomRight, text="+X", command=self.plusT)
- self.pTButton.pack(side=LEFT)
- self.dTButton = Button(self.bottomBottomRight, text="-X", command=self.minusT)
- self.dTButton.pack(side=LEFT)
- self.factorBut = Button(self.bottomBottomRight, text="Factor", command = self.weakFactor)
- self.factorBut.pack(side=LEFT)
- self.defactorBut = Button(self.bottomBottomRight, text="De-Factor", command = self.deFactor)
- self.defactorBut.pack(side=LEFT)
- root.mainloop()
- class Record:
- @staticmethod
- def ABD(A,B,D):
- e,n,d,x,a,b = ABD(A,B,D)
- return Record(e,n,d,x,a,b)
- @staticmethod
- def ENA(E,N,A):
- e,n,d,x,a,b = ENA(E,N,A)
- return Record(e,n,d,x,a,b)
- @staticmethod
- def AB(A,B):
- e,n,d,x,a,b = AB(A,B)
- return Record(e,n,d,x,a,b)
- @staticmethod
- def ABX(A,B,X):
- d = A + X
- return Record.ABD(A,B,d)
- @staticmethod
- def DEA(D,E,A):
- e,n,d,x,a,b = DEA(D,E,A)
- return Record(e,n,d,x,a,b)
- @staticmethod
- def ENX(E,N,X):
- e,n,d,x,a,b = ENX(E,N,X)
- return Record(e,n,d,x,a,b)
- @staticmethod
- def BSLS(bs,ls):
- c = bs*bs - ls*ls
- d = int(math.sqrt(c))
- e = c - d * d
- n = bs - d
- x = ls - n
- a = d - x
- b = a + 2*n + 2*x
- return Record(e,n,d,x,a,b)
- @staticmethod
- def tMethod(t,Ac, Bc, Xc, Dc):
- a = ABDguy(t,Ac)
- b = ABDguy(t,Bc)
- d = ABDguy(t,Dc)
- x = Xguy(t,Xc)
- e = a*b - d*d
- n = (b - a - 2*x)//2
- return Record(e,n,d,x,a,b)
- @staticmethod
- def printRecs(recs):
- maxLen = 5
- for i in Record.strs():
- if(len(i)>maxLen):
- maxLen = len(i)
- for i in recs:
- for j in i.vals():
- if(len(str(j)) > maxLen):
- maxLen = len(str(j))
- start = ""
- for i in Record.strs():
- start += " "*(maxLen-len(i)) + i + "|"
- start += "\n"
- for rec in recs:
- for val in rec.vals():
- start += " "*(maxLen-len(str(val))) + str(val) + "|"
- start += "\n"
- print(start)
- @staticmethod
- def createStuff():
- strings = ["ABD","ABX","ENA","DEA","ENX"]
- funcs = [Record.ABD, Record.ABX, Record.ENA, Record.DEA, Record.ENX]
- return strings,funcs
- @staticmethod
- def strs():
- return ['e','n','d','x','a','b','c','bs','ls','f','nn','2d1n1g','f-1','n-1']
- def vals(self):
- return [self.e, self.n, self.d, self.x, self.a, self.b, self.c,
- self.bs, self.ls, self.f, (self.nn,self.nn%8),
- (self.dd1n1,self.dd1n1%8), (self.f1,self.f1%8),
- (self.n1,self.n1%8)]
- def __init__(self,E,N,D,X,A,B):
- self.e = E
- self.n = N
- self.d = D
- self.x = X
- self.a = A
- self.b = B
- self.c = A*B
- self.bs = D+N
- self.ls = X+N
- self.f = 2*D + 1 - E
- self.nn = N*N
- self.dd1n1 = (2*D-1)*(N-1)
- self.f1 = self.f - 1
- self.n1 = self.n - 1
- if(self.ls%2 == 0):
- print("xn even")
- def __str__(self):
- return str((self.e, self.n, self.d, self.x, self.a, self.b))
- def __getitem__(self,indices):
- return self.vals()[indices]
- def F(self):
- self.d = self.d+1
- self.e = self.c - self.d**2
- self.x = self.d - self.a
- self.n = (self.b + self.a)//2 - self.d
- def FI(self):
- self = Record.ABD(self.a, self.b, self.d-1)
- def bigRec(self):
- return self.b**2 + self.b * self.a
- def shiftE(self,W):
- e,n,d,x,a,b = self.e, self.n,self.d,self.x,self.a,self.b
- return Record(e+2*W*n, n, d+W, x, a+W, b+W)
- def swapDN(self):
- return Record.ABD(self.a, self.b, self.n)
- def zeroD(self):
- return Record.ABD(self.a, self.b, 0)
- def shiftN(self,amt):
- e,n,d,x,a,b = self.e, self.n, self.d, self.x, self.a, self.b
- return Record(e + 2*a*amt, n + amt, d, x, a, b+2*amt)
- def zeroN2(self):
- return self.shiftN(-self.n)
- def zeroN(self):
- return Record.ABD(self.a, self.b, self.bs)
- def oneN(self):
- return Record.ABD(self.a, self.b, 1).swapDN()
- def shiftD(self,n):
- return Record.ABD(self.a, self.b, self.d + n)
- def upAB(self):
- return Record.AB(self.a + 1, self.b + 1)
- def downAB(self):
- return Record.AB(self.a - 1, self.b - 1)
- def aubd(self):
- return Record.AB(self.a + 1, self.b - 1)
- def abdu(self):
- return Record.AB(self.a - 1, self.b + 1)
- def shiftAB(self, n):
- return Record.AB(self.a + n, self.b + n)
- def AB(A,B):
- C = A * B
- D = intSqrt(C)
- E = C - D * D
- X = D - A
- N = int(((X * X)+E)/(2 * A))
- return (int(E),int(N),int(D),int(X),int(A),int(B))
- def ABD(A,B,D):
- C = A * B
- E = C - D * D
- X = D - A
- N = int(((X * X)+E)/(2 * A))
- return (int(E),int(N),int(D),int(X),int(A),int(B))
- def EDX(E,D,X):
- C = D*D + E
- A = D - X
- B = int(C/A)
- N = int((X*X+E)/(2*A))
- return (E,N,D,X,A,B)
- def ENA(E,N,A):
- # 2na = xx + e
- X = intSqrt(2*N*A - E)
- D = X + A
- C = D*D + E
- B = C//A
- return (E,N,D,X,A,B)
- def END(E,N,D):
- C = D * D + E
- A = D - X
- B = A + 2*X + 2*N
- return (E,N,D,X,A,B)
- def ENX(E,N,X):
- A = int((X*X + E) / (2*N))
- D = X + A
- C = D*D + E
- B = A + 2*X + 2*N
- return (E,N,D,X,A,B)
- def DEA(D,E,A):
- C = D*D + E
- B = C//A
- X = D - A
- N = (X*X + E)//(2*A)
- return (E,N,D,X,A,B)
- def intSqrt(n):
- x = n
- y = (x + 1) // 2
- while y < x:
- x = y
- y = (x + n // x) // 2
- return x
- def rec2String(record):
- string = ""
- for i in range(6):
- string += str(record[i])+"-"
- return string
- def generateSquare(record, squareWidth = 4):
- n = record[1]
- x = record[3]
- d = record[2]
- e = record[0]
- nn = n*n
- f = 2*d + 1 - e
- 2
- xn = x+n
- width = xn
- if(xn%2==0):
- return
- vals = [n*n, (2*d-1)*(n-1), f-1, n-1]
- red = (166,52,70)
- green = (96,211,148)
- yellow = (247,240,82)
- blue = (35,116,171)
- orange = (242,129,35)
- colors = [blue, green, yellow, orange]
- divs = []
- mods = []
- for val in vals:
- divs.append(val//8)
- mods.append(val%8)
- miniSquares = [[0 for i in range(width)] for j in range(width)]
- center = xn//2
- baseColors = []
- for j in range(len(divs)):
- for i in range(divs[j]):
- baseColors.append(colors[j])
- if(j == 1):
- baseColors.append(red)
- baseColors.append(red)
- #draw triangles part
- for triangle in range(1,9):
- colorDex = 0
- if(triangle in [2,3,6,7]): #horizontal drawing
- if(triangle == 2):
- xStart = center
- yStart = center - 1
- yDir = -1
- legDir = -1
- if(triangle == 3):
- xStart = center + 1
- yStart = center - 1
- yDir = -1
- legDir = 1
- if(triangle == 6):
- xStart = center - 1
- yStart = center + 1
- yDir = 1
- legDir = -1
- if(triangle == 7):
- xStart = center
- yStart = center + 1
- yDir = 1
- legDir = 1
- for y in range(1,center+1):
- for x in range(y):
- xCoord = xStart + (legDir * x)
- yCoord = (yStart + (yDir) * (y-1))
- miniSquares[yCoord][xCoord] = baseColors[colorDex]
- colorDex += 1
- else:
- if(triangle == 1):
- xStart = center - 1
- yStart = center - 1
- xDir = -1
- legDir = -1
- if(triangle == 4):
- xStart = center + 1
- yStart = center
- xDir = 1
- legDir = -1
- if(triangle == 5):
- xStart = center - 1
- yStart = center
- xDir = -1
- legDir = 1
- if(triangle == 8):
- xStart = center + 1
- yStart = center + 1
- xDir = 1
- legDir = 1
- for x in range(1,center+1):
- for y in range(x):
- xCoord = xStart + (xDir * (x-1))
- yCoord = yStart + (legDir * y)
- miniSquares[yCoord][xCoord] = baseColors[colorDex]
- colorDex += 1
- res = makeSquare(squareWidth,width,miniSquares)
- return res
- def makeSquare(squareWidth, squares, entries):
- totalWidth = (squares-1) + squareWidth*(squares)
- img = Image.new('RGB', (totalWidth,totalWidth))
- draw = ImageDraw.Draw(img)
- for i in range(len(entries)):
- row = entries[i]
- for j in range(len(row)):
- color = row[j]
- fillSquare(j,i,squareWidth,draw, color)
- return img
- def fillSquare(x,y,squareWidth, draw, color):
- xPix = x*(squareWidth + 1)
- yPix = y*(squareWidth + 1)
- draw.rectangle( ((xPix,yPix),(xPix + squareWidth, yPix + squareWidth)), fill = color)
- j = EndWindow()
Advertisement
Add Comment
Please, Sign In to add comment