emayecs | 5656b2b | 2021-08-04 12:44:13 -0400 | [diff] [blame] | 1 | #!/usr/bin/env python3 |
emayecs | 5966a53 | 2021-07-29 10:07:02 -0400 | [diff] [blame] | 2 | # |
| 3 | #-------------------------------------------------------- |
emayecs | 1474831 | 2021-08-05 14:21:26 -0400 | [diff] [blame] | 4 | # Symbol Builder for the project manager |
emayecs | 5966a53 | 2021-07-29 10:07:02 -0400 | [diff] [blame] | 5 | # |
| 6 | #-------------------------------------------------------- |
| 7 | # Written by Tim Edwards |
| 8 | # efabless, inc. |
| 9 | # September 21, 2016 |
| 10 | # Version 0.1 |
| 11 | #-------------------------------------------------------- |
| 12 | |
| 13 | import tkinter |
| 14 | from tkinter import ttk |
| 15 | |
| 16 | class SymbolBuilder(tkinter.Toplevel): |
emayecs | 1474831 | 2021-08-05 14:21:26 -0400 | [diff] [blame] | 17 | """symbol builder.""" |
emayecs | 5966a53 | 2021-07-29 10:07:02 -0400 | [diff] [blame] | 18 | |
| 19 | def __init__(self, parent = None, pinlist = None, fontsize = 11, *args, **kwargs): |
| 20 | '''See the __init__ for Tkinter.Toplevel.''' |
| 21 | tkinter.Toplevel.__init__(self, parent, *args, **kwargs) |
| 22 | self.transient(parent) |
| 23 | self.parent = parent |
| 24 | |
| 25 | s = ttk.Style() |
| 26 | s.configure('normal.TButton', font=('Helvetica', fontsize), border = 3, relief = 'raised') |
| 27 | |
emayecs | 1474831 | 2021-08-05 14:21:26 -0400 | [diff] [blame] | 28 | self.title('Symbol Builder') |
emayecs | 5966a53 | 2021-07-29 10:07:02 -0400 | [diff] [blame] | 29 | self.pframe = tkinter.Frame(self) |
| 30 | self.pframe.grid(column = 0, row = 0, sticky = "news") |
| 31 | |
| 32 | self.pframe.pindisplay = tkinter.Text(self.pframe) |
| 33 | self.pframe.pindisplay.pack(side = 'left', fill = 'y') |
| 34 | # Add scrollbar to symbol builder window |
| 35 | self.pframe.scrollbar = ttk.Scrollbar(self.pframe) |
| 36 | self.pframe.scrollbar.pack(side='right', fill='y') |
| 37 | # attach symbol builder window to scrollbar |
| 38 | self.pframe.pindisplay.config(yscrollcommand = self.pframe.scrollbar.set) |
| 39 | self.pframe.scrollbar.config(command = self.pframe.pindisplay.yview) |
| 40 | |
| 41 | self.bbar = ttk.Frame(self) |
| 42 | self.bbar.grid(column = 0, row = 1, sticky = "news") |
| 43 | self.bbar.cancel_button = ttk.Button(self.bbar, text='Cancel', |
| 44 | command=self.close, style = 'normal.TButton') |
| 45 | self.bbar.cancel_button.grid(column=0, row=0, padx = 5) |
| 46 | |
| 47 | self.bbar.okay_button = ttk.Button(self.bbar, text='Okay', |
| 48 | command=self.okay, style = 'normal.TButton') |
| 49 | self.bbar.okay_button.grid(column=1, row=0, padx = 5) |
| 50 | |
| 51 | typelist = ['input', 'output', 'inout', 'power', 'gnd'] |
| 52 | self.pinlist = [] |
| 53 | self.pvar = [] |
| 54 | self.result = None |
| 55 | |
| 56 | # Each pinlist entry is in the form <pin_name>:<type> |
| 57 | # where <type> is one of "input", "output", "inout", |
| 58 | # "power", or "gnd". |
| 59 | |
| 60 | n = 0 |
| 61 | for pin in pinlist: |
| 62 | p = pin.split(':') |
| 63 | pinname = p[0] |
| 64 | pintype = p[1] |
| 65 | |
| 66 | newpvar = tkinter.StringVar(self.pframe.pindisplay) |
| 67 | self.pinlist.append(pinname) |
| 68 | self.pvar.append(newpvar) |
| 69 | newpvar.set(pintype) |
| 70 | ttk.Label(self.pframe.pindisplay, text=pinname, |
| 71 | style = 'normal.TButton').grid(row = n, |
| 72 | column = 0, padx = 5, sticky = 'nsew') |
| 73 | ttk.OptionMenu(self.pframe.pindisplay, newpvar, |
| 74 | pintype, *typelist, style = 'blue.TMenubutton').grid(row = n, |
| 75 | column = 1, padx = 5, sticky = 'nswe') |
| 76 | n += 1 |
| 77 | |
| 78 | self.grab_set() |
| 79 | self.initial_focus = self |
| 80 | self.protocol("WM_DELETE_WINDOW", self.close) |
| 81 | self.initial_focus.focus_set() |
| 82 | self.wait_window(self) |
| 83 | |
| 84 | def grid_configure(self, padx, pady): |
| 85 | pass |
| 86 | |
| 87 | def okay(self): |
| 88 | # return the new pin list. |
| 89 | pinlist = [] |
| 90 | n = 0 |
| 91 | for p in self.pinlist: |
| 92 | pinlist.append(p + ':' + str(self.pvar[n].get())) |
| 93 | n += 1 |
| 94 | |
| 95 | self.withdraw() |
| 96 | self.update_idletasks() |
| 97 | self.result = pinlist |
| 98 | self.close() |
| 99 | |
| 100 | def close(self): |
| 101 | # remove symbol builder window |
| 102 | self.parent.focus_set() |
| 103 | self.destroy() |