Advertisement
gregwa

FCM 86 - Python part 55 Cross Stitch Pattern Creator - UI

May 10th, 2014
589
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #======================================================
  2. #  Cross Stitch Pattern Generator
  3. #  cspg.py
  4. #  Written by G.D. Walters
  5. #  Created for Full Circle Magazine issues 85, 86, 87 & 88
  6. #  FCM 86 - Part 55 - UI
  7. #======================================================
  8. from Tkinter import *
  9. import tkFileDialog
  10. import tkCommonDialog
  11. import tkMessageBox
  12. import ttk
  13. from PIL import Image,ImageTk,ImageOps
  14. import Pmw
  15. import apsw  # Database Access
  16. import math  # Math library
  17. import sys
  18.  
  19.  
  20. class XStitch:
  21.     def __init__(self, master):
  22.         self.picFormats = [
  23.         ('JPEG / JFIF','*.jpg'),
  24.         ('Portable Network Graphics','*.png'),
  25.         ('CompuServer GIF','*.gif'),
  26.         ('Windows Bitmap','*.bmp'),
  27.         ('All File Types *.*','*.*'),
  28.         ]
  29.  
  30.         self.openimage = PhotoImage(file='open.gif')
  31.         self.DefaultImage =ImageTk.PhotoImage(self.Thumbnail("default.jpg",450,450))
  32.         #-------------------------------------------
  33.         #            Global Definitions
  34.         #-------------------------------------------
  35.         #               UI Required
  36.         global OriginalFilename
  37.         OriginalFilename = StringVar()
  38.         global OriginalColorCount
  39.         OriginalColorCount = StringVar()
  40.         global OriginalSize
  41.         OriginalSize = StringVar()
  42.         global ComboStitch
  43.         ComboStitch = IntVar()
  44.         global ComboSize
  45.         ComboSize = StringVar()
  46.         global FabricWidth
  47.         FabricWidth = DoubleVar()
  48.         global FabricHeight
  49.         FabricHeight = DoubleVar()
  50.         global MaxColors
  51.         MaxColors = IntVar()
  52.         global BorderSize
  53.         BorderSize = DoubleVar()
  54.         global ProcessedColors
  55.         ProcessedColors = StringVar()
  56.         global ProcessedSize
  57.         ProcessedSize = StringVar()
  58.         global DmcColor
  59.         DmcColor = StringVar()
  60.         #-------------------------------------------
  61.         global ShowGrid
  62.         ShowGrid = True
  63.         global ProcessedImage
  64.         ProcessedImage = ""
  65.         global GridImage
  66.         GridImage = ""
  67.         global backgroundColor1
  68.         backgroundColor1 = (120,)*3
  69.         global backgroundColor2
  70.         backgroundColor2 = (0,)*3  
  71.         global ReadyToProcess
  72.         ReadyToProcess = False 
  73.         #-------------------------
  74.         self.OpenDB()
  75.         self.MakeMenu(master)
  76.         frm = self.BuildWidgets(master)
  77.         self.PlaceWidgets(frm)
  78.        
  79. #======================================================    
  80. #                BEGIN UI DEFINITION
  81. #======================================================
  82.     def MakeMenu(self,master):
  83.         menu = Menu(master)
  84.         root.config(menu=menu)
  85.         filemenu = Menu(menu, tearoff=0)
  86.         process = Menu(menu,tearoff=0)
  87.         help = Menu(menu,tearoff=0)
  88.  
  89.         menu.add_cascade(label="File", menu=filemenu)
  90.         menu.add_cascade(label="Process",menu=process)
  91.         menu.add_cascade(label="Help",menu=help)
  92.         #-------------------------------------------
  93.         #               File Menu
  94.         #-------------------------------------------
  95.         filemenu.add_command(label="New")
  96.         filemenu.add_command(label="Open", command=self.GetFileName)
  97.         filemenu.add_command(label="Save", command=self.FileSave)
  98.         filemenu.add_separator()
  99.         filemenu.add_command(label="Exit", command=self.DoExit)
  100.         #-------------------------------------------
  101.         #                Process Menu
  102.         #-------------------------------------------
  103.         process.add_command(label="All",command=self.Process)
  104.         #-------------------------------------------
  105.         #                 Help Menu
  106.         #-------------------------------------------
  107.         help.add_command(label="Help",command=self.ShowHelp)
  108.         help.add_separator()
  109.         help.add_command(label="About",command=self.ShowAbout)
  110.        
  111.     def BuildWidgets(self,master):
  112.         self.frame = Frame(master,width=900,height=850)
  113.         # ---------------- TOP FRAME ---------------------
  114.         self.frm1 = Frame(self.frame,width=900,height=100,bd=4,relief=GROOVE)
  115.         self.label1 = Label(self.frm1,text = "Original Filename: ")
  116.         self.entFileName = Entry(self.frm1,width=50,textvariable=OriginalFilename)
  117.         self.btnGetFN = Button(self.frm1,width=28,image=self.openimage,command=self.GetFileName)
  118.         self.label2 = Label(self.frm1,text = "Original Colors: ")
  119.         self.lblOriginalColorCount = Label(self.frm1,text="",width=10,textvariable=OriginalColorCount)
  120.         self.label3 = Label(self.frm1,text = "Original Size: ")
  121.         self.lblOriginalSize = Label(self.frm1,text="",width=10,textvariable=OriginalSize)
  122.         # ---------------Middle Frame --------------------
  123.         self.frm2 = Frame(self.frame,width=900,height=160,bd=4,relief=GROOVE)
  124.         self.lbl4 = Label(self.frm2,text="Aida Stitch Size: ")
  125.         self.lbl5 = Label(self.frm2,text="Aida Fabric Size: ")
  126.         self.TCombobox1 = ttk.Combobox(self.frm2,textvariable=ComboStitch,width=8)
  127.         self.TCombobox1.bind('<<ComboboxSelected>>', self.StitchSizeSelect)
  128.         self.TCombobox1['values'] = (7,10,11,12,14,16,18,22)
  129.         self.TCombobox2 = ttk.Combobox(self.frm2,textvariable=ComboSize,width = 8)
  130.         self.TCombobox2.bind('<<ComboboxSelected>>',self.AidaSizeSelect)
  131.         self.TCombobox2['values'] = ("12x18","15x18","30")
  132.         self.lbl6 = Label(self.frm2,text="Max Colors: ")
  133.         self.entMaxColors = Entry(self.frm2,textvariable=MaxColors,width=3)
  134.         self.lbl7 = Label(self.frm2,text="Border Size: ")
  135.         self.entBorderSize = Entry(self.frm2,textvariable=BorderSize,width = 8)
  136.         self.frmLine = Frame(self.frm2,width=6,height=80,bd=3,relief="raised")
  137.         self.lbl8 = Label(self.frm2,text="      Processed Image Colors: ")
  138.         self.lbl9 = Label(self.frm2,text="Processed Image Stitch Count: ")
  139.         self.lblProcessedColors=Label(self.frm2,width=10,textvariable=ProcessedColors,justify=LEFT)
  140.         self.lblProcessedSize=Label(self.frm2,width=10,textvariable=ProcessedSize,justify=LEFT)
  141.         self.btnDoIt = Button(self.frm2,text="Process",width=11,command = self.Process)
  142.         self.btnShowGrid = Button(self.frm2,text="Hide Grid",width=11,command=self.ShowHideGrid)
  143.         self.btnCreatePDF=Button(self.frm2,text="Create PDF",width=11,command=self.CreatePDF)
  144.         ComboStitch.set(14)
  145.         ComboSize.set("15x18")
  146.         FabricWidth.set(15)
  147.         FabricHeight.set(18)
  148.         MaxColors.set(50)
  149.         BorderSize.set(1.0)    
  150.         # --------------- Bottom Frame ------------------
  151.         self.frm3 = Frame(self.frame,width=450,height=450,bd=4,relief=GROOVE)
  152.         self.lblImageL = Label(self.frm3,image=self.DefaultImage,height=400,width=400,borderwidth=2,relief=GROOVE)
  153.         self.lblImageR = Label(self.frm3,image=self.DefaultImage,height=400,width=400,borderwidth=2,relief=GROOVE)
  154.         #---------------- Side Frame -------------------
  155.         self.frm4 = Frame(self.frame,width = 300,height=580,bd=4,relief=GROOVE)
  156.         # Create the ScrolledFrame.
  157.         self.sf = Pmw.ScrolledFrame(self.frm4,
  158.                 labelpos = 'n', label_text = 'Processed Color List',
  159.                 usehullsize = 1,
  160.                 hull_width = 300,
  161.                 hull_height = 567,)
  162.         return self.frame
  163.        
  164.     def PlaceWidgets(self,frame):
  165.         frame.grid(column = 0, row = 0)
  166.         # ---------------- TOP FRAME ---------------------
  167.         self.frm1.grid(column=0,row=0,rowspan=2,sticky="new")
  168.         self.label1.grid(column=0,row=0,sticky='w')
  169.         self.entFileName.grid(column=1,row=0,sticky='w',columnspan = 5)
  170.         self.btnGetFN.grid(column=7,row = 0,sticky='w')
  171.         self.label2.grid(column=9,row=0,sticky='w',padx=10)
  172.         self.lblOriginalColorCount.grid(column=10,row=0,sticky='w')
  173.         self.label3.grid(column=9,row=1,sticky='w',padx=10,pady=5)
  174.         self.lblOriginalSize.grid(column=10,row=1,sticky='w')
  175.         # ---------------- MIDDLE FRAME ---------------------
  176.         self.frm2.grid(column=0,row=2,rowspan=2,sticky="new")
  177.         self.lbl4.grid(column=0,row=0,sticky="new",pady=5)
  178.         self.lbl5.grid(column=0,row=1,sticky="new")
  179.         self.TCombobox1.grid(column=1,row=0,sticky="new",pady=5)
  180.         self.TCombobox2.grid(column=1,row=1,sticky="new")
  181.         self.lbl6.grid(column=2,row = 0,sticky="new",padx=5,pady=5)
  182.         self.entMaxColors.grid(column=3,row=0,sticky="new",pady=5)
  183.         self.lbl7.grid(column=2,row=1,sticky='new',padx=5)
  184.         self.entBorderSize.grid(column=3,row=1,sticky='new')
  185.         self.frmLine.grid(column=4,row=0,rowspan=2,sticky='new',padx=15)
  186.         self.lbl8.grid(column=5,row=0,sticky='new',pady=5)
  187.         self.lbl9.grid(column=5,row=1,sticky='new')
  188.         self.lblProcessedColors.grid(column=6,row=0,sticky='w')
  189.         self.lblProcessedSize.grid(column=6,row=1,sticky='new')
  190.         self.btnDoIt.grid(column=7,row=0,sticky='e',padx=5,pady = 5)
  191.         self.btnShowGrid.grid(column=7,row=1,sticky='e',padx=5,pady = 5)
  192.         self.btnCreatePDF.grid(column=8,row=0,rowspan=2,sticky='ew',padx=10)
  193.         # ---------------- BOTTOM FRAME ---------------------
  194.         self.frm3.grid(column=0,row=4,sticky="nsew")
  195.         self.lblImageL.grid(column=0,row=0,sticky="w")
  196.         self.lblImageR.grid(column=1,row=0,sticky="e")
  197.         # ---------------- SIDE FRAME ---------------------
  198.         self.frm4.grid(column=2,row=0,rowspan=12,sticky="new")
  199.         self.sf.grid(column=0,row=1)
  200.         self.sfFrame = self.sf.interior()
  201.         self.lblch1 = Label(self.sfFrame,text="    Original")
  202.         self.lblch2 = Label(self.sfFrame,text="    DMC")
  203.         self.lblch3 = Label(self.sfFrame,text="Name/Number")
  204.         self.lblch1.grid(column=0,row=0,sticky='w')
  205.         self.lblch2.grid(column=1,row=0,sticky='w')
  206.         self.lblch3.grid(column=2,row=0,sticky="w")
  207.        
  208. #======================================================
  209. #               END UI DEFINITION
  210. #======================================================
  211.  
  212.        
  213.     def GetFileName(self):
  214.         pass
  215.        
  216.     def FileSave(self):
  217.         pass
  218.        
  219.     def ShowHelp(self):
  220.         pass
  221.        
  222.     def ShowAbout(self):
  223.         pass
  224.        
  225.     def DoExit(self):
  226.         sys.exit()     
  227.        
  228.     def OpenDB(self):
  229.         pass
  230.        
  231.     def ShowHideGrid(self):
  232.         pass
  233.            
  234.     def StitchSizeSelect(self,p):
  235.         pass
  236.        
  237.     def AidaSizeSelect(self,p):
  238.         pass
  239.        
  240.     def Process(self):
  241.         pass
  242.  
  243.     def CreatePDF(self):
  244.         pass
  245.            
  246. #======================================================
  247. #            Process Specific Functions
  248. #======================================================
  249.        
  250.     def Thumbnail(self,file,hsize,wsize):
  251.         size = hsize,wsize
  252.         extpos = file.rfind(".")
  253.         outfile = file[:extpos] + ".thumbnail"
  254.         im = Image.open(file)
  255.         im.thumbnail(size)
  256.         im.save(outfile,"JPEG")
  257.         return im
  258.        
  259.     def OriginalInfo(self,file):
  260.         pass
  261.    
  262.     def GetColorCount(self,file):
  263.         pass
  264.        
  265.     def GetHW(self,file):
  266.         pass
  267.  
  268.     def GetHW2(self,file):
  269.         pass
  270.        
  271.     def GetColors(self,image):
  272.         pass
  273.                    
  274.     def Pixelate(self,im,pixelSize):
  275.         pass
  276.  
  277.     def ReduceColours(self,ImageName):
  278.         pass
  279.  
  280.     def MakeLines(self,im,pixelSize):
  281.         pass
  282.            
  283.     def MakeLines2(self,im,pixelSize):
  284.         pass
  285.                                
  286.     def Rgb2Hex(self,rgb):
  287.         pass
  288.        
  289.     def FillScrolledList(self,filename):
  290.         pass
  291.              
  292.     def GetBestDistance(self,r1,g1,b1):
  293.         # dist = math.sqrt(((r1-r2)**2) + ((g1-g2)**2) + ((b1-b2)**2))
  294.         pass
  295.  
  296.  
  297.        
  298. root = Tk()
  299. root.title("Cross Stitch Pattern Creator")
  300. test = XStitch(root)
  301. root.mainloop()
Advertisement
Advertisement
Advertisement
RAW Paste Data Copied
Advertisement