Changeset 106
- Timestamp:
- 04/12/08 22:11:29 (6 months ago)
- Files:
-
- sucrose/trunk/python/keypad_tk.py (modified) (7 diffs)
- sucrose/trunk/python/sucrose (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
sucrose/trunk/python/keypad_tk.py
r103 r106 8 8 9 9 """ 10 A pygtkfrontend for selecting an item in a classic keypad manner10 A Tkinter frontend for selecting an item in a classic keypad manner 11 11 """ 12 12 … … 17 17 i.update(tray) 18 18 19 20 def make_switch_view(self, view):21 return lambda: self.switch_view(view)22 23 24 19 def make_view(self, view_name, view): 25 setattr(self,view_name, view) 26 self.menu.add_command(label=view_name, command=self.make_switch_view(view)) 20 setattr(self, view_name, view) 21 button = Tkinter.Button(self.switcher, text=view_name, 22 font=('helvetica', 24, 'bold'), 23 command=lambda: self.switch_view(view)) 24 button.pack(side=Tkinter.LEFT, expand=True) 27 25 self.views.append(view) 26 self.view_buttons[view] = button 28 27 self.view_names.append(view_name) 29 28 self.current_view = view 30 31 # I don't know why I need to do this, but I do 32 view.pack() 33 view.pack_forget() 34 29 self.current_view.grid(row=1, column=0, sticky=Tkinter.EW) 30 self.current_view.grid_forget() 35 31 36 32 def __init__(self, sucrose, auth): 37 self.auth = auth 33 self.auth = auth 38 34 self.sucrose = sucrose 39 35 40 36 self.window = Tkinter.Tk() 41 37 self.window.geometry('640x480+0+0') 38 self.window.resizable(False, False) 39 self.window.focus_set() 40 42 41 self.view_names = [] 43 42 43 self.view_buttons = {} 44 44 self.views = [] 45 45 46 self.menu = Tkinter.Menu(self.window, font=("helvetica",24)) 46 self.switcher = Tkinter.Frame(self.window) 47 self.switcher.grid(row=0, column=0) 47 48 48 49 self.current_view = None 49 self.make_view('Keypad', Keypad(sucrose, auth, self.update, exit=self.destroy)) 50 self.make_view('Nutrition', Nutrition(sucrose, auth, self.update, exit=self.destroy)) 51 self.make_view('Statistics', Statistics(sucrose, auth, self.update, exit=self.destroy)) 52 53 self.window.config(menu=self.menu) 54 55 self.current_view.pack() 56 57 # Kill yourself after 15 seconds 58 self.window.after(15000,self.destroy) 59 self.menu.add_command(label="Quit", command=self.destroy) 60 50 self.make_view('Statistics', Statistics(sucrose, auth, self.update, 51 exit=self.destroy)) 52 self.make_view('Nutrition', Nutrition(sucrose, auth, self.update, 53 exit=self.destroy)) 54 55 self.switch_view(self.current_view) 56 57 self.keypad = Keypad(sucrose, auth, self.update, exit=self.destroy) 58 self.keypad.grid(row=1, column=1) 59 self.views.append(self.keypad) 60 61 # Kill yourself after 30 seconds 62 # self.window.after(30000,self.destroy) 63 Tkinter.Button(self.window, text="Cancel", 64 font=('helvetica', 24, 'bold'), command=self.destroy).\ 65 grid(row=0, column=1, sticky=Tkinter.E) 61 66 self.window.mainloop() 62 67 63 68 64 69 def switch_view(self, view): 65 self.current_view.pack_forget() 70 self.current_view.grid_forget() 71 self.view_buttons[self.current_view].config(relief=Tkinter.RAISED) 66 72 self.current_view = view 67 view.pack() 73 self.view_buttons[view].config(relief=Tkinter.SUNKEN) 74 view.grid(row=1, column=0) 68 75 69 76 70 77 def destroy(self): 71 if hasattr(self,'window'): 72 for i in self.view_names: 73 getattr(self,i).destroy() 74 self.window.destroy() 75 del self.window 78 if not hasattr(self,'window'): 79 return 80 for i in self.view_names: 81 getattr(self,i).destroy() 82 self.window.destroy() 83 del self.window 76 84 77 85 … … 80 88 def update(self, tray): 81 89 return 90 91 def __init__(self, sucrose, auth, update_f, exit=None, location=None, 92 master=None, cnf={}, **kw): 93 Tkinter.Frame.__init__(self,master=None,cnf={},**kw) 94 95 self.auth = auth 96 self.update_f = update_f 97 98 self.sucrose = sucrose 99 self.distruct = exit 100 self.location = location 101 102 # { BEGIN statistics GUI 103 self.Name = Tkinter.Label(self, text="Statistics", 104 font=("helvetica", 36)) 105 self.Name.grid(row=0,column=0,sticky=Tkinter.NSEW) 106 # } END statistics GUI 107 108 109 110 class Nutrition(Tkinter.Frame): 111 ROWS = (('Caffeine', 'caffeine'), 112 ('Calories', 'calories'), 113 ('Sugar', 'sugar'), 114 ('Carbohydrates', 'carbohydrates'), 115 ('Fiber', 'fiber'), 116 ('Sodium', 'sodium'), 117 ('Fat', 'fat'), 118 ('Saturated Fat', 'saturated_fat'), 119 ('Protein', 'protein'), 120 ('Cholesterol', 'cholesterol')) 121 122 def update(self, tray): 123 if tray: 124 item = self.sucrose.item_from_tray(tray) 125 for name, attr in self.ROWS: 126 label = getattr(self, attr) 127 label.config(text=tray and getattr(item, attr, '') or '') 82 128 83 129 def __init__(self, sucrose, auth, update_f, exit=None, location=None, master=None, cnf={}, **kw): 84 130 Tkinter.Frame.__init__(self,master=None,cnf={},**kw) 85 131 86 self.auth = auth 132 self.auth = auth 87 133 self.update_f = update_f 88 89 134 self.sucrose = sucrose 90 135 self.distruct = exit 91 136 self.location = location 92 137 93 # { BEGIN statistics GUI 94 self.Name = Tkinter.Label(self, text="Statistics", font=("helvetica", 72)) 95 self.Name.grid(row=0,column=0,sticky=Tkinter.N+Tkinter.S+Tkinter.E+Tkinter.W) 96 # } END statistics GUI 97 98 99 100 class Nutrition(Tkinter.Frame): 101 def update(self, tray): 102 self.item = self.sucrose.item_from_tray(tray) 103 self.row = 0 104 self.make_item("Caffeine", self.item.caffeine) 105 self.make_item("Calories", self.item.calories) 106 self.make_item("Sugar", self.item.sugar) 107 self.make_item("Carbohydrates", self.item.carbohydrates) 108 self.make_item("Fiber", self.item.fiber) 109 self.make_item("Sodium", self.item.sodium) 110 self.make_item("Fat", self.item.fat) 111 self.make_item("Saturated Fat", self.item.saturated_fat) 112 self.make_item("Protein", self.item.protein) 113 self.make_item("Cholesterol", self.item.cholesterol) 114 115 116 def make_item(self, name, value): 117 self.row = self.row + 1 118 Tkinter.Label(self, text=name+" ", bg="white", anchor=Tkinter.NW, font=("helvetica", 16))\ 119 .grid(row=2*self.row, column=0, sticky=Tkinter.N+Tkinter.S+Tkinter.E+Tkinter.W) 120 Tkinter.Label(self, text=value, bg="white", anchor=Tkinter.NE, font=("helvetica", 16))\ 121 .grid(row=2*self.row, column=1, sticky=Tkinter.N+Tkinter.S+Tkinter.E+Tkinter.W) 122 123 124 def __init__(self, sucrose, auth, update_f, exit=None, location=None, master=None, cnf={}, **kw): 125 Tkinter.Frame.__init__(self,master=None,cnf={},**kw) 126 127 self.auth = auth 128 self.update_f = update_f 129 self.sucrose = sucrose 130 self.distruct = exit 131 self.location = location 132 self.item = None 133 134 self.row = 0 135 self.make_item("Caffeine", 0) 136 self.make_item("Calories", 0) 137 self.make_item("Sugar", 0) 138 self.make_item("Carbohydrates", 0) 139 self.make_item("Fiber", 0) 140 self.make_item("Sodium", 0) 141 self.make_item("Fat", 0) 142 self.make_item("Saturated Fat", 0) 143 self.make_item("Protein", 0) 144 self.make_item("Cholesterol", 0) 145 146 147 138 Tkinter.Label(self, text='Nutrition Facts', anchor=Tkinter.W, 139 font=('helvetica', 24, 'bold'), bg='white').grid( 140 row=0, column=0, sticky=Tkinter.EW) 141 Tkinter.Label(self, text='000', anchor=Tkinter.E, 142 font=('helvetica', 24), bg='white', fg='white').grid( 143 row=0, column=1, sticky=Tkinter.EW) 144 145 for row, (name, attr) in enumerate(self.ROWS): 146 Tkinter.Label(self, text=name + ' ', anchor=Tkinter.W, 147 font=("helvetica", 24), bg='white').grid( 148 row=row + 1, column=0, sticky=Tkinter.EW) 149 val_label = \ 150 Tkinter.Label(self, text='', anchor=Tkinter.E, 151 font=("helvetica", 24), bg='white') 152 val_label.grid(row=row + 1, column=1, sticky=Tkinter.EW) 153 154 setattr(self, attr, val_label) 155 156 # self.config(width=self.parent. 148 157 149 158 class Keypad(Tkinter.Frame): 150 159 def update(self, tray): 160 self.tray = tray 161 if not tray: 162 self.item = None 163 self.vend.config(state=Tkinter.DISABLED) 164 return 165 151 166 self.item_location=str(tray.machine_tray_id) 152 self.tray = tray153 167 self.item = self.sucrose.item_from_tray(self.tray) 154 168 155 169 self.location.config(text=self.item_location) 156 self.name.config(text=self.item.name) 170 self.name.config( 171 text=getattr(self.item, 'name', '').replace('(', '\n('), 172 fg='black') 157 173 158 174 self.auth.authenticate_purchase(self.item_location) … … 163 179 def make_button_callback(self,number): 164 180 return lambda: self.button_callback(number) 165 166 181 167 182 def button_callback(self,number): 168 183 try: 169 184 self.item_location=self.item_location[1]+str(number) 170 185 self.location.config(text=self.item_location) 171 172 self.tray = self.sucrose.tray_from_location(self.item_location) 173 # self.item = self.sucrose.item_from_tray(self.tray) 174 175 # self.name.config(text=self.item.name) 176 177 # self.auth.authenticate_purchase(self.item_location) 178 179 # self.vend.config(state=Tkinter.NORMAL) 180 181 self.update_f(self.tray) 182 183 # If it's not a valid purchase, don't allow the user to press the vend button 184 except: 186 187 tray = self.sucrose.tray_from_location(self.item_location) 188 189 # If it's not a valid purchase, don't allow the user to press 190 # the vend button 191 except Exception, e: 185 192 self.location.config(text=self.item_location) 186 self.name.config(text="") 187 self.vend.config(state=Tkinter.DISABLED) 188 193 self.name.config(text=str(e), fg='red') 194 tray = None 195 196 self.update_f(tray) 189 197 190 198 def reset(self): … … 204 212 205 213 206 def __init__(self, sucrose, auth, update_f, exit=None, location=None, master=None, cnf={}, **kw): 214 def __init__(self, sucrose, auth, update_f, exit=None, location=None, 215 master=None, cnf={}, **kw): 207 216 Tkinter.Frame.__init__(self,master=None,cnf={},**kw) 208 217 209 self.auth = auth 210 self.update_f = update_f 218 self.auth = auth 219 self.update_f = update_f 211 220 self.sucrose = sucrose 212 221 self.distruct = exit … … 216 225 217 226 # { BEGIN keypad GUI 218 Tkinter.Button(self, text="0", command=self.make_button_callback(0), \ 219 font=("helvetica",72)).grid(row=4,column=0,sticky=Tkinter.N+Tkinter.S+Tkinter.E+Tkinter.W) 220 227 Tkinter.Button(self, text=" 0 ", command=self.make_button_callback(0), 228 font=("helvetica",48)).grid( 229 row=4,column=0,sticky=Tkinter.NSEW) 230 221 231 for y in range(0,4): 222 232 for x in range(0,3): 223 233 i=3*y+x+1 224 if i<10: 225 callback=self.make_button_callback(i) 226 Tkinter.Button(self, text=str(i), command=callback, \ 227 font=("helvetica", 72)).grid(row=y+1,column=x,sticky=Tkinter.N+Tkinter.S+Tkinter.E+Tkinter.W) 234 if i >= 10: 235 continue 236 callback=self.make_button_callback(i) 237 Tkinter.Button(self, text=' %d ' % i, command=callback, 238 font=("helvetica", 48)).grid( 239 row=y+1,column=x,sticky=Tkinter.NSEW) 228 240 229 241 # Special objects 230 reset=Tkinter.Button(self, text="Reset", command=self.reset, font=("helvetica", 24)) 231 reset.grid(row=4,column=1,sticky=Tkinter.N+Tkinter.S+Tkinter.E+Tkinter.W) 232 233 self.vend=Tkinter.Button(self, text="Vend", command=self.vend, state=Tkinter.DISABLED, font=("helvetica", 24)) 234 self.vend.grid(row=4,column=2,sticky=Tkinter.N+Tkinter.S+Tkinter.E+Tkinter.W) 242 reset=Tkinter.Button(self, text="Reset", command=self.reset, 243 font=("helvetica", 24)) 244 reset.grid(row=4,column=1,sticky=Tkinter.NSEW) 245 246 self.vend=Tkinter.Button(self, text="Vend", command=self.vend, 247 state=Tkinter.DISABLED, 248 font=("helvetica", 24, 'bold')) 249 self.vend.grid(row=4,column=2,sticky=Tkinter.NSEW) 235 250 236 251 self.item_location="00" 237 self.location=Tkinter.Label(self, text=self.item_location, font=("helvetica", 72)) 238 self.location.grid(row=0,column=0,sticky=Tkinter.N+Tkinter.S+Tkinter.E+Tkinter.W) 239 240 self.name=Tkinter.Label(self, text="", font=("helvetica",24)) 241 self.name.grid(row=0,column=1,columnspan=3,sticky=Tkinter.N+Tkinter.S+Tkinter.E+Tkinter.W) 252 self.location=Tkinter.Label(self, text=self.item_location, 253 font=("helvetica", 48)) 254 self.location.grid(row=0,column=0,sticky=Tkinter.NSEW) 255 256 self.name = Tkinter.Label(self, text="", 257 font=('helvetica', 13, ''), 258 wraplength=180) 259 self.name.grid(row=0,column=1,columnspan=3,sticky=Tkinter.NSEW) 242 260 243 261 self.grid() … … 246 264 247 265 if __name__ == "__main__": 248 TkinterUI(0,0) 249 266 from api import sucrose 267 from dummy import Cardswipe 268 269 s = sucrose.Sucrose(db, dbonly=True) 270 TkinterUI(s, Cardswipe(s)) sucrose/trunk/python/sucrose
r103 r106 18 18 19 19 while True: 20 #user = card.authenticate_session()20 user = card.authenticate_session() 21 21 22 if False: 23 # if not user: 22 if not user: 24 23 print "User does not exist" 25 24 continue
