Changeset 106

Show
Ignore:
Timestamp:
04/12/08 22:11:29 (6 months ago)
Author:
njriley
Message:

UI looks and works better now

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • sucrose/trunk/python/keypad_tk.py

    r103 r106  
    88 
    99""" 
    10 A pygtk frontend for selecting an item in a classic keypad manner 
     10A Tkinter frontend for selecting an item in a classic keypad manner 
    1111""" 
    1212 
     
    1717                                i.update(tray) 
    1818 
    19  
    20         def make_switch_view(self, view): 
    21                 return lambda: self.switch_view(view) 
    22  
    23  
    2419        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) 
    2725                self.views.append(view) 
     26                self.view_buttons[view] = button 
    2827                self.view_names.append(view_name) 
    2928                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() 
    3531 
    3632        def __init__(self, sucrose, auth): 
    37                 self.auth = auth  
     33                self.auth = auth 
    3834                self.sucrose = sucrose 
    3935 
    4036                self.window = Tkinter.Tk() 
    41          
     37                self.window.geometry('640x480+0+0') 
     38                self.window.resizable(False, False) 
     39                self.window.focus_set() 
     40 
    4241                self.view_names = [] 
    4342 
     43                self.view_buttons = {} 
    4444                self.views = [] 
    4545 
    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) 
    4748 
    4849                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) 
    6166                self.window.mainloop() 
    6267 
    6368 
    6469        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) 
    6672                self.current_view = view 
    67                 view.pack() 
     73                self.view_buttons[view].config(relief=Tkinter.SUNKEN) 
     74                view.grid(row=1, column=0) 
    6875 
    6976 
    7077        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 
    7684 
    7785 
     
    8088        def update(self, tray): 
    8189                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 
     110class 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 '') 
    82128 
    83129        def __init__(self, sucrose, auth, update_f, exit=None, location=None, master=None, cnf={}, **kw): 
    84130                Tkinter.Frame.__init__(self,master=None,cnf={},**kw) 
    85131 
    86                 self.auth = auth  
     132                self.auth = auth 
    87133                self.update_f = update_f 
    88  
    89134                self.sucrose = sucrose 
    90135                self.distruct = exit 
    91136                self.location = location 
    92137 
    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. 
    148157 
    149158class Keypad(Tkinter.Frame): 
    150159        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 
    151166                self.item_location=str(tray.machine_tray_id) 
    152                 self.tray = tray 
    153167                self.item = self.sucrose.item_from_tray(self.tray) 
    154168 
    155169                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') 
    157173 
    158174                self.auth.authenticate_purchase(self.item_location) 
     
    163179        def make_button_callback(self,number): 
    164180                return lambda: self.button_callback(number) 
    165          
    166          
     181 
    167182        def button_callback(self,number): 
    168183                try: 
    169184                        self.item_location=self.item_location[1]+str(number) 
    170185                        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: 
    185192                        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) 
    189197 
    190198        def reset(self): 
     
    204212 
    205213 
    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): 
    207216                Tkinter.Frame.__init__(self,master=None,cnf={},**kw) 
    208217 
    209                 self.auth = auth  
    210                 self.update_f = update_f  
     218                self.auth = auth 
     219                self.update_f = update_f 
    211220                self.sucrose = sucrose 
    212221                self.distruct = exit 
     
    216225 
    217226                # { 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 
    221231                for y in range(0,4): 
    222232                        for x in range(0,3): 
    223233                                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) 
    228240 
    229241                # 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) 
    235250 
    236251                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) 
    242260 
    243261                self.grid() 
     
    246264 
    247265if __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  
    1818 
    1919        while True: 
    20 #             user = card.authenticate_session() 
     20              user = card.authenticate_session() 
    2121                 
    22                 if False: 
    23 #               if not user: 
     22                if not user: 
    2423                        print "User does not exist" 
    2524                        continue