Guest User

Untitled

a guest
May 31st, 2018
216
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 15.77 KB | None | 0 0
  1. from Tkinter import *
  2. from PIL import ImageTk, Image, ImageDraw, ImageFont
  3. import os
  4.  
  5. class EndWindow:
  6. # starts on 11, 6, 12, 7, 5, 31
  7.  
  8. def __init__(self):
  9. self.pics = {}
  10. self.record = Record.AB(5,31)
  11. self.squareWidth = 4
  12. self.buildWindow()
  13. self.redrawCanvas()
  14.  
  15.  
  16. def changeRecord(self,newRec):
  17. self.record = newRec
  18. self.redrawCanvas()
  19.  
  20.  
  21. def zoomIn(self):
  22. self.squareWidth += 1
  23. self.redrawCanvas()
  24.  
  25. def zoomOut(self):
  26. self.squareWidth -= 1
  27. if(self.squareWidth < 1):
  28. self.squareWidth = 1
  29. self.redrawCanvas()
  30.  
  31. def updateAB(self):
  32. aVal = int(self.aEntry.get())
  33. bVal = int(self.bEntry.get())
  34. self.record = tec.ab(aVal,bVal)
  35. self.redrawCanvas()
  36.  
  37. def createRecord(self):
  38. string = self.createVar.get()
  39. strings, creates = Record.createStuff()
  40. i = strings.index(string)
  41. self.record = creates[i](int(self.oneEntry.get()), int(self.twoEntry.get()), int(self.threeEntry.get()))
  42. self.redrawCanvas()
  43.  
  44. def redrawCanvas(self):
  45. #leftSide
  46. recString = rec2String(self.record)
  47. if(recString not in self.pics.keys()):
  48. self.pics[recString] = {}
  49.  
  50. ww = self.squareWidth
  51.  
  52. if(ww not in self.pics[recString]):
  53. IMG = generateSquare(self.record, squareWidth = ww)
  54. tkim = ImageTk.PhotoImage(IMG)
  55. self.pics[recString][ww] = tkim
  56.  
  57. tkim = self.pics[recString][ww]
  58.  
  59. self.canvas.delete(ALL)
  60. self.imagesprite = self.canvas.create_image(200,200,image=tkim)
  61. self.canvas.pack(side=BOTTOM)
  62.  
  63. #rightside
  64. self.updateRightLabels()
  65. #self.root.mainloop()
  66.  
  67. def updateRightLabels(self):
  68. frm = self.bottomRightFrame
  69. for widget in frm.winfo_children():
  70. widget.destroy()
  71.  
  72. for i in range(len(Record.strs())):
  73. newframe = Frame(frm)
  74. newframe.pack(side=LEFT)
  75.  
  76. label = Label(newframe, text=Record.strs()[i])
  77. value = Label(newframe, text=str(self.record.vals()[i]))
  78. label.pack(side=TOP)
  79. value.pack(side=BOTTOM)
  80.  
  81.  
  82.  
  83. def upE(self,event):
  84. self.UPE()
  85.  
  86. def UPE(self):
  87. e = self.record[0]
  88. n = self.record[1]
  89. x = self.record[3]
  90. newE = e + 2*n
  91.  
  92. self.record = Record.ENX(newE, n, x)
  93. self.redrawCanvas()
  94.  
  95. def downE(self,event):
  96. self.DOWNE()
  97.  
  98. def DOWNE(self):
  99. e = self.record[0]
  100. n = self.record[1]
  101. x = self.record[3]
  102. newE = e - 2*n
  103. self.record = Record.ENX(newE, n, x)
  104. self.redrawCanvas()
  105.  
  106. def minusT(self):
  107. e = self.record[0]
  108. n = self.record[1]
  109. x = self.record[3] - 2
  110.  
  111. aVal = (x*x + e)*(1.0)/(2*n)
  112. while(aVal%1 != 0 or (x+n)%2 == 0):
  113. x -= 2
  114. aVal = (x*x + e)*(1.0)/(2*n)
  115.  
  116. self.record = Record.ENX(e,n,x)
  117. self.redrawCanvas()
  118.  
  119.  
  120. def plusT(self):
  121. e = self.record[0]
  122. n = self.record[1]
  123. x = self.record[3] + 2
  124.  
  125. aVal = (x*x + e)*(1.0)/(2*n)
  126. while(aVal%1 != 0):
  127. x += 2
  128. aVal = (x*x + e)*(1.0)/(2*n)
  129.  
  130. self.record = Record.ENX(e,n,x)
  131. self.redrawCanvas()
  132.  
  133.  
  134.  
  135.  
  136. def buildWindow(self):
  137. self.root = Tk()
  138. root = self.root
  139.  
  140. root.bind('<Left>', self.downE)
  141. root.bind('<Right>', self.upE)
  142.  
  143. self.leftFrame = Frame(root)
  144. self.rightFrame = Frame(root)
  145. self.leftFrame.pack(side=LEFT)
  146. self.rightFrame.pack(side=RIGHT)
  147. leftFrame = self.leftFrame
  148. rightFrame = self.rightFrame
  149.  
  150. #left side
  151. self.topToolFrame = Frame(leftFrame)
  152. topToolFrame = self.topToolFrame
  153. self.ZObutton = Button(topToolFrame, text="-", command=self.zoomOut)
  154. self.ZIbutton = Button(topToolFrame, text="+", command=self.zoomIn)
  155. self.ZObutton.pack(side=LEFT)
  156. self.ZIbutton.pack(side=RIGHT)
  157. self.topToolFrame.pack(side=TOP)
  158.  
  159. self.canvas = Canvas(leftFrame, width=400, height=400)
  160. IMG = generateSquare(self.record, squareWidth = self.squareWidth)
  161. tkim = ImageTk.PhotoImage(IMG)
  162. self.imagesprite = self.canvas.create_image(200,200,image=tkim)
  163. self.canvas.pack(side=BOTTOM)
  164.  
  165. #right side
  166.  
  167. #top right
  168. self.topRightFrame = Frame(self.rightFrame, padx = 10, pady = 10)
  169. self.topRightFrame.pack(side=TOP)
  170.  
  171. self.ABLabel = Label(self.topRightFrame, text="AB:")
  172. self.ABLabel.pack(side=LEFT)
  173.  
  174. self.aEntry = Entry(self.topRightFrame, width=5)
  175. self.aEntry.pack(side=LEFT)
  176. self.bEntry = Entry(self.topRightFrame, width=5)
  177. self.bEntry.pack(side=LEFT)
  178.  
  179. self.ABButton = Button(self.topRightFrame, text="AB", command = self.updateAB)
  180. self.ABButton.pack(side=RIGHT)
  181.  
  182. #mid right
  183. self.midRightFrame = Frame(self.rightFrame)
  184. self.midRightFrame.pack()
  185.  
  186. listOptions, funcList = Record.createStuff()
  187. self.createVar = StringVar(self.midRightFrame)
  188. self.popMenu = OptionMenu(self.midRightFrame, self.createVar, *listOptions)
  189. self.popMenu.config(width = 8)
  190. self.popMenu.pack(side=LEFT)
  191.  
  192. self.oneEntry = Entry(self.midRightFrame, width=5)
  193. self.oneEntry.pack(side=LEFT)
  194. self.twoEntry = Entry(self.midRightFrame, width=5)
  195. self.twoEntry.pack(side=LEFT)
  196. self.threeEntry = Entry(self.midRightFrame, width=5)
  197. self.threeEntry.pack(side=LEFT)
  198.  
  199. self.CreateButton = Button(self.midRightFrame, text="Create", command = self.createRecord)
  200. self.CreateButton.pack(side=RIGHT)
  201.  
  202. #bottom right
  203. self.bottomRightFrame = Frame(self.rightFrame)
  204. self.bottomRightFrame.pack(side = BOTTOM)
  205. self.updateRightLabels()
  206.  
  207. #last row
  208. self.bottomBottomRight = Frame(self.rightFrame)
  209. self.bottomBottomRight.pack(side=BOTTOM)
  210.  
  211. self.e2nButtonU = Button(self.bottomBottomRight, text="e+2n", command=self.UPE)
  212. self.e2nButtonU.pack(side=LEFT)
  213. self.e2nButtonD = Button(self.bottomBottomRight, text="e-2n", command=self.DOWNE)
  214. self.e2nButtonD.pack(side=LEFT)
  215. self.pTButton = Button(self.bottomBottomRight, text="+X", command=self.plusT)
  216. self.pTButton.pack(side=LEFT)
  217. self.dTButton = Button(self.bottomBottomRight, text="-X", command=self.minusT)
  218. self.dTButton.pack(side=LEFT)
  219.  
  220.  
  221. root.mainloop()
  222.  
  223. class Record:
  224.  
  225. @staticmethod
  226. def ABD(A,B,D):
  227. e,n,d,x,a,b = ABD(A,B,D)
  228. return Record(e,n,d,x,a,b)
  229.  
  230. @staticmethod
  231. def ENA(E,N,A):
  232. e,n,d,x,a,b = ENA(E,N,A)
  233. return Record(e,n,d,x,a,b)
  234.  
  235. @staticmethod
  236. def AB(A,B):
  237. e,n,d,x,a,b = AB(A,B)
  238. return Record(e,n,d,x,a,b)
  239.  
  240. @staticmethod
  241. def ABX(A,B,X):
  242. d = A + X
  243. return Record.ABD(A,B,d)
  244.  
  245. @staticmethod
  246. def DEA(D,E,A):
  247. e,n,d,x,a,b = DEA(D,E,A)
  248. return Record(e,n,d,x,a,b)
  249.  
  250. @staticmethod
  251. def ENX(E,N,X):
  252. e,n,d,x,a,b = ENX(E,N,X)
  253. return Record(e,n,d,x,a,b)
  254.  
  255. @staticmethod
  256. def BSLS(bs,ls):
  257. c = bs*bs - ls*ls
  258. d = int(math.sqrt(c))
  259. e = c - d * d
  260. n = bs - d
  261. x = ls - n
  262. a = d - x
  263. b = a + 2*n + 2*x
  264. return Record(e,n,d,x,a,b)
  265.  
  266. @staticmethod
  267. def tMethod(t,Ac, Bc, Xc, Dc):
  268. a = ABDguy(t,Ac)
  269. b = ABDguy(t,Bc)
  270. d = ABDguy(t,Dc)
  271. x = Xguy(t,Xc)
  272. e = a*b - d*d
  273. n = (b - a - 2*x)//2
  274. return Record(e,n,d,x,a,b)
  275.  
  276. @staticmethod
  277. def printRecs(recs):
  278. maxLen = 5
  279. for i in Record.strs():
  280. if(len(i)>maxLen):
  281. maxLen = len(i)
  282. for i in recs:
  283. for j in i.vals():
  284. if(len(str(j)) > maxLen):
  285. maxLen = len(str(j))
  286.  
  287. start = ""
  288. for i in Record.strs():
  289. start += " "*(maxLen-len(i)) + i + "|"
  290. start += "\n"
  291.  
  292. for rec in recs:
  293. for val in rec.vals():
  294. start += " "*(maxLen-len(str(val))) + str(val) + "|"
  295. start += "\n"
  296. print(start)
  297.  
  298. @staticmethod
  299. def createStuff():
  300. strings = ["ABD","ABX","ENA","DEA","ENX"]
  301. funcs = [Record.ABD, Record.ABX, Record.ENA, Record.DEA, Record.ENX]
  302. return strings,funcs
  303.  
  304. @staticmethod
  305. def strs():
  306. return ['e','n','d','x','a','b','c','bs','ls','f','nn','2d1n1g','f-1','n-1']
  307.  
  308. def vals(self):
  309. return [self.e, self.n, self.d, self.x, self.a, self.b, self.c,
  310. self.bs, self.ls, self.f, (self.nn,self.nn%8),
  311. (self.dd1n1,self.dd1n1%8), (self.f1,self.f1%8),
  312. (self.n1,self.n1%8)]
  313.  
  314.  
  315.  
  316. def __init__(self,E,N,D,X,A,B):
  317. self.e = E
  318. self.n = N
  319. self.d = D
  320. self.x = X
  321. self.a = A
  322. self.b = B
  323. self.c = A*B
  324. self.bs = D+N
  325. self.ls = X+N
  326. self.f = 2*D + 1 - E
  327. self.nn = N*N
  328. self.dd1n1 = (2*D-1)*(N-1)
  329. self.f1 = self.f - 1
  330. self.n1 = self.n - 1
  331.  
  332.  
  333. def __str__(self):
  334. return str((self.e, self.n, self.d, self.x, self.a, self.b))
  335.  
  336. def __getitem__(self,indices):
  337. return self.vals()[indices]
  338.  
  339. def F(self):
  340. self.d = self.d+1
  341. self.e = self.c - self.d**2
  342. self.x = self.d - self.a
  343. self.n = (self.b + self.a)//2 - self.d
  344.  
  345.  
  346. def FI(self):
  347. self = Record.ABD(self.a, self.b, self.d-1)
  348.  
  349. def bigRec(self):
  350. return self.b**2 + self.b * self.a
  351.  
  352. def shiftE(self,W):
  353. e,n,d,x,a,b = self.e, self.n,self.d,self.x,self.a,self.b
  354. return Record(e+2*W*n, n, d+W, x, a+W, b+W)
  355.  
  356. def swapDN(self):
  357. return Record.ABD(self.a, self.b, self.n)
  358.  
  359. def zeroD(self):
  360. return Record.ABD(self.a, self.b, 0)
  361.  
  362. def shiftN(self,amt):
  363. e,n,d,x,a,b = self.e, self.n, self.d, self.x, self.a, self.b
  364. return Record(e + 2*a*amt, n + amt, d, x, a, b+2*amt)
  365.  
  366. def zeroN2(self):
  367. return self.shiftN(-self.n)
  368.  
  369. def zeroN(self):
  370. return Record.ABD(self.a, self.b, self.bs)
  371.  
  372. def oneN(self):
  373. return Record.ABD(self.a, self.b, 1).swapDN()
  374.  
  375. def shiftD(self,n):
  376. return Record.ABD(self.a, self.b, self.d + n)
  377.  
  378. def upAB(self):
  379. return Record.AB(self.a + 1, self.b + 1)
  380.  
  381. def downAB(self):
  382. return Record.AB(self.a - 1, self.b - 1)
  383.  
  384. def aubd(self):
  385. return Record.AB(self.a + 1, self.b - 1)
  386.  
  387. def abdu(self):
  388. return Record.AB(self.a - 1, self.b + 1)
  389.  
  390. def shiftAB(self, n):
  391. return Record.AB(self.a + n, self.b + n)
  392.  
  393.  
  394.  
  395. def AB(A,B):
  396. C = A * B
  397. D = intSqrt(C)
  398. E = C - D * D
  399. X = D - A
  400. N = int(((X * X)+E)/(2 * A))
  401. return (int(E),int(N),int(D),int(X),int(A),int(B))
  402.  
  403. def ABD(A,B,D):
  404. C = A * B
  405. E = C - D * D
  406. X = D - A
  407. N = int(((X * X)+E)/(2 * A))
  408. return (int(E),int(N),int(D),int(X),int(A),int(B))
  409.  
  410. def EDX(E,D,X):
  411. C = D*D + E
  412. A = D - X
  413. B = int(C/A)
  414. N = int((X*X+E)/(2*A))
  415. return (E,N,D,X,A,B)
  416.  
  417. def ENA(E,N,A):
  418. # 2na = xx + e
  419. X = intSqrt(2*N*A - E)
  420. D = X + A
  421. C = D*D + E
  422. B = C//A
  423. return (E,N,D,X,A,B)
  424.  
  425. def END(E,N,D):
  426. C = D * D + E
  427. A = D - X
  428. B = A + 2*X + 2*N
  429. return (E,N,D,X,A,B)
  430.  
  431. def ENX(E,N,X):
  432. A = int((X*X + E) / (2*N))
  433. D = X + A
  434. C = D*D + E
  435. B = A + 2*X + 2*N
  436. return (E,N,D,X,A,B)
  437.  
  438. def DEA(D,E,A):
  439. C = D*D + E
  440. B = C//A
  441. X = D - A
  442. N = (X*X + E)//(2*A)
  443. return (E,N,D,X,A,B)
  444.  
  445.  
  446. def intSqrt(n):
  447. x = n
  448. y = (x + 1) // 2
  449. while y < x:
  450. x = y
  451. y = (x + n // x) // 2
  452. return x
  453.  
  454. def rec2String(record):
  455. string = ""
  456. for i in range(6):
  457. string += str(record[i])+"-"
  458. return string
  459.  
  460.  
  461. def generateSquare(record, squareWidth = 4):
  462. n = record[1]
  463. x = record[3]
  464. d = record[2]
  465. e = record[0]
  466. nn = n*n
  467. f = 2*d + 1 - e
  468. 2
  469. xn = x+n
  470. width = xn
  471. if(xn%2==0):
  472. return
  473.  
  474. vals = [n*n, (2*d-1)*(n-1), f-1, n-1]
  475.  
  476. red = (166,52,70)
  477. green = (96,211,148)
  478. yellow = (247,240,82)
  479. blue = (35,116,171)
  480. orange = (242,129,35)
  481.  
  482. colors = [blue, green, yellow, orange]
  483. divs = []
  484. mods = []
  485. for val in vals:
  486. divs.append(val//8)
  487. mods.append(val%8)
  488.  
  489.  
  490. miniSquares = [[0 for i in range(width)] for j in range(width)]
  491. center = xn//2
  492.  
  493. baseColors = []
  494. for j in range(len(divs)):
  495. for i in range(divs[j]):
  496. baseColors.append(colors[j])
  497. if(j == 1):
  498. baseColors.append(red)
  499. baseColors.append(red)
  500.  
  501. #draw triangles part
  502.  
  503. for triangle in range(1,9):
  504.  
  505. colorDex = 0
  506.  
  507. if(triangle in [2,3,6,7]): #horizontal drawing
  508. if(triangle == 2):
  509. xStart = center
  510. yStart = center - 1
  511. yDir = -1
  512. legDir = -1
  513. if(triangle == 3):
  514. xStart = center + 1
  515. yStart = center - 1
  516. yDir = -1
  517. legDir = 1
  518. if(triangle == 6):
  519. xStart = center - 1
  520. yStart = center + 1
  521. yDir = 1
  522. legDir = -1
  523. if(triangle == 7):
  524. xStart = center
  525. yStart = center + 1
  526. yDir = 1
  527. legDir = 1
  528.  
  529. for y in range(1,center+1):
  530. for x in range(y):
  531. xCoord = xStart + (legDir * x)
  532. yCoord = (yStart + (yDir) * (y-1))
  533. miniSquares[yCoord][xCoord] = baseColors[colorDex]
  534. colorDex += 1
  535. else:
  536. if(triangle == 1):
  537. xStart = center - 1
  538. yStart = center - 1
  539. xDir = -1
  540. legDir = -1
  541. if(triangle == 4):
  542. xStart = center + 1
  543. yStart = center
  544. xDir = 1
  545. legDir = -1
  546. if(triangle == 5):
  547. xStart = center - 1
  548. yStart = center
  549. xDir = -1
  550. legDir = 1
  551. if(triangle == 8):
  552. xStart = center + 1
  553. yStart = center + 1
  554. xDir = 1
  555. legDir = 1
  556.  
  557.  
  558. for x in range(1,center+1):
  559. for y in range(x):
  560. xCoord = xStart + (xDir * (x-1))
  561. yCoord = yStart + (legDir * y)
  562. miniSquares[yCoord][xCoord] = baseColors[colorDex]
  563. colorDex += 1
  564. res = makeSquare(squareWidth,width,miniSquares)
  565. return res
  566.  
  567. def makeSquare(squareWidth, squares, entries):
  568. totalWidth = (squares-1) + squareWidth*(squares)
  569.  
  570. img = Image.new('RGB', (totalWidth,totalWidth))
  571. draw = ImageDraw.Draw(img)
  572.  
  573. for i in range(len(entries)):
  574. row = entries[i]
  575. for j in range(len(row)):
  576. color = row[j]
  577. fillSquare(j,i,squareWidth,draw, color)
  578. return img
  579.  
  580.  
  581. def fillSquare(x,y,squareWidth, draw, color):
  582. xPix = x*(squareWidth + 1)
  583. yPix = y*(squareWidth + 1)
  584. draw.rectangle( ((xPix,yPix),(xPix + squareWidth, yPix + squareWidth)), fill = color)
  585.  
  586.  
  587.  
  588. j = EndWindow()
Advertisement
Add Comment
Please, Sign In to add comment