| #!/usr/bin/env python3 |
| # |
| #-------------------------------------------------------- |
| # Symbol Builder for the project manager |
| # |
| #-------------------------------------------------------- |
| # Written by Tim Edwards |
| # efabless, inc. |
| # September 21, 2016 |
| # Version 0.1 |
| #-------------------------------------------------------- |
| |
| import tkinter |
| from tkinter import ttk |
| |
| class SymbolBuilder(tkinter.Toplevel): |
| """symbol builder.""" |
| |
| def __init__(self, parent = None, pinlist = None, fontsize = 11, *args, **kwargs): |
| '''See the __init__ for Tkinter.Toplevel.''' |
| tkinter.Toplevel.__init__(self, parent, *args, **kwargs) |
| self.transient(parent) |
| self.parent = parent |
| |
| s = ttk.Style() |
| s.configure('normal.TButton', font=('Helvetica', fontsize), border = 3, relief = 'raised') |
| |
| self.title('Symbol Builder') |
| self.pframe = tkinter.Frame(self) |
| self.pframe.grid(column = 0, row = 0, sticky = "news") |
| |
| self.pframe.pindisplay = tkinter.Text(self.pframe) |
| self.pframe.pindisplay.pack(side = 'left', fill = 'y') |
| # Add scrollbar to symbol builder window |
| self.pframe.scrollbar = ttk.Scrollbar(self.pframe) |
| self.pframe.scrollbar.pack(side='right', fill='y') |
| # attach symbol builder window to scrollbar |
| self.pframe.pindisplay.config(yscrollcommand = self.pframe.scrollbar.set) |
| self.pframe.scrollbar.config(command = self.pframe.pindisplay.yview) |
| |
| self.bbar = ttk.Frame(self) |
| self.bbar.grid(column = 0, row = 1, sticky = "news") |
| self.bbar.cancel_button = ttk.Button(self.bbar, text='Cancel', |
| command=self.close, style = 'normal.TButton') |
| self.bbar.cancel_button.grid(column=0, row=0, padx = 5) |
| |
| self.bbar.okay_button = ttk.Button(self.bbar, text='Okay', |
| command=self.okay, style = 'normal.TButton') |
| self.bbar.okay_button.grid(column=1, row=0, padx = 5) |
| |
| typelist = ['input', 'output', 'inout', 'power', 'gnd'] |
| self.pinlist = [] |
| self.pvar = [] |
| self.result = None |
| |
| # Each pinlist entry is in the form <pin_name>:<type> |
| # where <type> is one of "input", "output", "inout", |
| # "power", or "gnd". |
| |
| n = 0 |
| for pin in pinlist: |
| p = pin.split(':') |
| pinname = p[0] |
| pintype = p[1] |
| |
| newpvar = tkinter.StringVar(self.pframe.pindisplay) |
| self.pinlist.append(pinname) |
| self.pvar.append(newpvar) |
| newpvar.set(pintype) |
| ttk.Label(self.pframe.pindisplay, text=pinname, |
| style = 'normal.TButton').grid(row = n, |
| column = 0, padx = 5, sticky = 'nsew') |
| ttk.OptionMenu(self.pframe.pindisplay, newpvar, |
| pintype, *typelist, style = 'blue.TMenubutton').grid(row = n, |
| column = 1, padx = 5, sticky = 'nswe') |
| n += 1 |
| |
| self.grab_set() |
| self.initial_focus = self |
| self.protocol("WM_DELETE_WINDOW", self.close) |
| self.initial_focus.focus_set() |
| self.wait_window(self) |
| |
| def grid_configure(self, padx, pady): |
| pass |
| |
| def okay(self): |
| # return the new pin list. |
| pinlist = [] |
| n = 0 |
| for p in self.pinlist: |
| pinlist.append(p + ':' + str(self.pvar[n].get())) |
| n += 1 |
| |
| self.withdraw() |
| self.update_idletasks() |
| self.result = pinlist |
| self.close() |
| |
| def close(self): |
| # remove symbol builder window |
| self.parent.focus_set() |
| self.destroy() |