EE149
/
FinalProject
Final Project files for mBed development.
user-gui.py@28:9976a94efa83, 2014-12-08 (annotated)
- Committer:
- alecguertin
- Date:
- Mon Dec 08 10:52:42 2014 +0000
- Revision:
- 28:9976a94efa83
- Parent:
- 14:41fa8b95a9ab
- Child:
- 29:459ff10d2a07
end of sunday
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
lsaristo | 12:1aa6b8a74136 | 1 | #!/usr/bin/python |
lsaristo | 14:41fa8b95a9ab | 2 | """"Paint program by Dave Michell. |
lsaristo | 12:1aa6b8a74136 | 3 | |
lsaristo | 14:41fa8b95a9ab | 4 | NOTE: A substantial portion of this code was taken from Dave Michell's |
lsaristo | 14:41fa8b95a9ab | 5 | example illustrating how to draw on a Python-generated canvas. All credit |
lsaristo | 14:41fa8b95a9ab | 6 | for those portions of the code belong to him. Below is the header from the |
lsaristo | 14:41fa8b95a9ab | 7 | original document written by him. |
lsaristo | 12:1aa6b8a74136 | 8 | |
lsaristo | 14:41fa8b95a9ab | 9 | # Start origin header ######################## |
lsaristo | 14:41fa8b95a9ab | 10 | |
lsaristo | 14:41fa8b95a9ab | 11 | Subject: tkinter "paint" example |
lsaristo | 14:41fa8b95a9ab | 12 | From: Dave Mitchell <davem@magnet.com> |
lsaristo | 14:41fa8b95a9ab | 13 | To: python-list@cwi.nl |
lsaristo | 14:41fa8b95a9ab | 14 | Date: Fri, 23 Jan 1998 12:18:05 -0500 (EST) |
lsaristo | 14:41fa8b95a9ab | 15 | |
lsaristo | 14:41fa8b95a9ab | 16 | Not too long ago (last week maybe?) someone posted a request |
lsaristo | 14:41fa8b95a9ab | 17 | for an example of a paint program using Tkinter. Try as I might |
lsaristo | 14:41fa8b95a9ab | 18 | I can't seem to find it in the archive, so i'll just post mine |
lsaristo | 14:41fa8b95a9ab | 19 | here and hope that the person who requested it sees this! |
lsaristo | 14:41fa8b95a9ab | 20 | |
lsaristo | 14:41fa8b95a9ab | 21 | All this does is put up a canvas and draw a smooth black line |
lsaristo | 14:41fa8b95a9ab | 22 | whenever you have the mouse button down, but hopefully it will |
lsaristo | 14:41fa8b95a9ab | 23 | be enough to start with.. It would be easy enough to add some |
lsaristo | 14:41fa8b95a9ab | 24 | options like other shapes or colors... |
lsaristo | 12:1aa6b8a74136 | 25 | |
lsaristo | 12:1aa6b8a74136 | 26 | yours, |
lsaristo | 12:1aa6b8a74136 | 27 | dave mitchell |
lsaristo | 12:1aa6b8a74136 | 28 | davem@magnet.com |
lsaristo | 12:1aa6b8a74136 | 29 | |
lsaristo | 14:41fa8b95a9ab | 30 | # End original header ######################### |
lsaristo | 12:1aa6b8a74136 | 31 | |
lsaristo | 12:1aa6b8a74136 | 32 | """ |
lsaristo | 12:1aa6b8a74136 | 33 | from Tkinter import * |
lsaristo | 12:1aa6b8a74136 | 34 | import os |
lsaristo | 12:1aa6b8a74136 | 35 | import sys |
lsaristo | 14:41fa8b95a9ab | 36 | import re |
lsaristo | 14:41fa8b95a9ab | 37 | |
lsaristo | 14:41fa8b95a9ab | 38 | """paint.py: not exactly a paint program. just a smooth line drawing demo.""" |
lsaristo | 12:1aa6b8a74136 | 39 | |
lsaristo | 12:1aa6b8a74136 | 40 | TEMP_FILE = "canvas-temp.ps" |
lsaristo | 12:1aa6b8a74136 | 41 | OUTPUT_FILE = "control.out" |
lsaristo | 12:1aa6b8a74136 | 42 | b1 = "up" |
lsaristo | 12:1aa6b8a74136 | 43 | xold, yold = None, None |
lsaristo | 12:1aa6b8a74136 | 44 | height = 600 |
lsaristo | 12:1aa6b8a74136 | 45 | width = 600 |
lsaristo | 12:1aa6b8a74136 | 46 | |
lsaristo | 12:1aa6b8a74136 | 47 | class popupWindow(object): |
lsaristo | 12:1aa6b8a74136 | 48 | def __init__(self,master): |
lsaristo | 12:1aa6b8a74136 | 49 | top=self.top=Toplevel(master) |
lsaristo | 12:1aa6b8a74136 | 50 | self.l=Label(top,text="Resize Window") |
lsaristo | 12:1aa6b8a74136 | 51 | self.l.pack() |
lsaristo | 12:1aa6b8a74136 | 52 | self.h=Label(top,text="Height"); |
lsaristo | 12:1aa6b8a74136 | 53 | self.h.pack() |
lsaristo | 12:1aa6b8a74136 | 54 | self.e=Entry(top) |
lsaristo | 12:1aa6b8a74136 | 55 | self.e.pack() |
lsaristo | 12:1aa6b8a74136 | 56 | self.w=Label(top,text="Width"); |
lsaristo | 12:1aa6b8a74136 | 57 | self.w.pack() |
lsaristo | 12:1aa6b8a74136 | 58 | self.f=Entry(top); |
lsaristo | 12:1aa6b8a74136 | 59 | self.f.pack() |
lsaristo | 12:1aa6b8a74136 | 60 | self.b=Button(top,text='Ok',command=self.cleanup) |
lsaristo | 12:1aa6b8a74136 | 61 | self.b.pack() |
lsaristo | 12:1aa6b8a74136 | 62 | self.master = master |
lsaristo | 12:1aa6b8a74136 | 63 | def cleanup(self): |
lsaristo | 12:1aa6b8a74136 | 64 | global height |
lsaristo | 12:1aa6b8a74136 | 65 | global width |
lsaristo | 12:1aa6b8a74136 | 66 | h = self.e.get() |
lsaristo | 12:1aa6b8a74136 | 67 | w = self.f.get() |
lsaristo | 12:1aa6b8a74136 | 68 | self.top.destroy() |
lsaristo | 12:1aa6b8a74136 | 69 | self.master.geometry(h+"x"+w) |
lsaristo | 12:1aa6b8a74136 | 70 | height = h |
lsaristo | 12:1aa6b8a74136 | 71 | width = w |
lsaristo | 12:1aa6b8a74136 | 72 | |
lsaristo | 12:1aa6b8a74136 | 73 | def loop(): |
lsaristo | 12:1aa6b8a74136 | 74 | root = Tk() |
lsaristo | 12:1aa6b8a74136 | 75 | root.geometry("%dx%d" % (height,width)) |
lsaristo | 12:1aa6b8a74136 | 76 | root.title("RoboCanvas") |
lsaristo | 12:1aa6b8a74136 | 77 | drawing_area = Canvas(root) |
lsaristo | 12:1aa6b8a74136 | 78 | drawing_area.pack(fill=BOTH,expand=1) |
lsaristo | 12:1aa6b8a74136 | 79 | drawing_area.bind("<Motion>", motion) |
lsaristo | 12:1aa6b8a74136 | 80 | drawing_area.bind("<ButtonPress-1>", b1down) |
lsaristo | 12:1aa6b8a74136 | 81 | drawing_area.bind("<ButtonRelease-1>", b1up) |
lsaristo | 12:1aa6b8a74136 | 82 | |
lsaristo | 12:1aa6b8a74136 | 83 | menubar = Menu(root) |
lsaristo | 12:1aa6b8a74136 | 84 | control_menu = Menu(root); |
lsaristo | 12:1aa6b8a74136 | 85 | control_menu.add_command(label="Deploy ", \ |
lsaristo | 12:1aa6b8a74136 | 86 | command=lambda p=drawing_area: build(p)); |
lsaristo | 12:1aa6b8a74136 | 87 | control_menu.add_command(label="Clear Canvas",\ |
lsaristo | 12:1aa6b8a74136 | 88 | command=lambda p=drawing_area: p.delete('all')) |
lsaristo | 12:1aa6b8a74136 | 89 | control_menu.add_command(label="Resize Canvas", command=lambda p=root:\ |
lsaristo | 12:1aa6b8a74136 | 90 | resize(root)); |
lsaristo | 12:1aa6b8a74136 | 91 | control_menu.add_separator() |
lsaristo | 12:1aa6b8a74136 | 92 | control_menu.add_command(label="Exit", command=lambda p=root: root.quit()) |
lsaristo | 14:41fa8b95a9ab | 93 | menubar.add_cascade(label="Control", menu=control_menu); |
lsaristo | 12:1aa6b8a74136 | 94 | root.config(menu=menubar); |
lsaristo | 14:41fa8b95a9ab | 95 | message = Label(root, text="Press and hold with the mouse to draw"); |
lsaristo | 12:1aa6b8a74136 | 96 | message.pack(side=BOTTOM) |
lsaristo | 12:1aa6b8a74136 | 97 | root.mainloop() |
lsaristo | 12:1aa6b8a74136 | 98 | |
lsaristo | 12:1aa6b8a74136 | 99 | def resize(root): |
lsaristo | 12:1aa6b8a74136 | 100 | """ Resize the root window and expand the canvas to fill """ |
lsaristo | 12:1aa6b8a74136 | 101 | ans = popupWindow(root); |
lsaristo | 12:1aa6b8a74136 | 102 | |
lsaristo | 12:1aa6b8a74136 | 103 | def build(canvas): |
lsaristo | 12:1aa6b8a74136 | 104 | """ |
lsaristo | 12:1aa6b8a74136 | 105 | This function is indended to be called from the drawing canvas after |
lsaristo | 12:1aa6b8a74136 | 106 | the drawing is complete and the user wishes to push it to the robot. |
lsaristo | 12:1aa6b8a74136 | 107 | This function must send (somehow) the appropriate information to the |
lsaristo | 12:1aa6b8a74136 | 108 | robot to make the drawing happen. |
lsaristo | 12:1aa6b8a74136 | 109 | """ |
lsaristo | 12:1aa6b8a74136 | 110 | gen_postscript(canvas) |
lsaristo | 12:1aa6b8a74136 | 111 | |
lsaristo | 12:1aa6b8a74136 | 112 | def gen_postscript(canvas): |
lsaristo | 12:1aa6b8a74136 | 113 | """ Make a postscript capture of the canvas """ |
lsaristo | 12:1aa6b8a74136 | 114 | |
lsaristo | 12:1aa6b8a74136 | 115 | # Get lineto and moveto data from standard postscript output. |
lsaristo | 12:1aa6b8a74136 | 116 | l = [] |
lsaristo | 12:1aa6b8a74136 | 117 | canvas.update() |
lsaristo | 12:1aa6b8a74136 | 118 | canvas.postscript(file=TEMP_FILE); |
lsaristo | 12:1aa6b8a74136 | 119 | f = open(TEMP_FILE, "r") |
lsaristo | 12:1aa6b8a74136 | 120 | for line in f.readlines(): |
lsaristo | 12:1aa6b8a74136 | 121 | if 'lineto' in line or 'moveto' in line: |
lsaristo | 12:1aa6b8a74136 | 122 | l.append(line) |
lsaristo | 12:1aa6b8a74136 | 123 | f.close() |
lsaristo | 12:1aa6b8a74136 | 124 | |
lsaristo | 14:41fa8b95a9ab | 125 | # Filter the moves list |
lsaristo | 14:41fa8b95a9ab | 126 | output = filter_moves(l) |
lsaristo | 12:1aa6b8a74136 | 127 | |
lsaristo | 12:1aa6b8a74136 | 128 | # Write filtered output to the new canvas file. |
lsaristo | 12:1aa6b8a74136 | 129 | l = l[5:] |
lsaristo | 12:1aa6b8a74136 | 130 | f = open(OUTPUT_FILE, "w"); |
lsaristo | 12:1aa6b8a74136 | 131 | f.write(str(height) + "/" + str(width)+"\n"); |
lsaristo | 14:41fa8b95a9ab | 132 | for line in output: |
lsaristo | 12:1aa6b8a74136 | 133 | f.write(line); |
lsaristo | 12:1aa6b8a74136 | 134 | f.close() |
lsaristo | 12:1aa6b8a74136 | 135 | os.remove(TEMP_FILE); |
lsaristo | 12:1aa6b8a74136 | 136 | |
lsaristo | 14:41fa8b95a9ab | 137 | def filter_moves(moves): |
lsaristo | 14:41fa8b95a9ab | 138 | """ Return a processed list of moves """ |
lsaristo | 14:41fa8b95a9ab | 139 | |
lsaristo | 14:41fa8b95a9ab | 140 | filtered_moves = list(moves)[5:] |
lsaristo | 14:41fa8b95a9ab | 141 | output_list = [] |
lsaristo | 14:41fa8b95a9ab | 142 | |
lsaristo | 14:41fa8b95a9ab | 143 | prev = filtered_moves[0] |
lsaristo | 14:41fa8b95a9ab | 144 | output_list.append(prev) # Write the first moveto always. |
lsaristo | 14:41fa8b95a9ab | 145 | prev = filtered_moves[1] |
lsaristo | 14:41fa8b95a9ab | 146 | output_list.append(prev) |
lsaristo | 14:41fa8b95a9ab | 147 | |
lsaristo | 14:41fa8b95a9ab | 148 | for move in filtered_moves[2:]: |
lsaristo | 14:41fa8b95a9ab | 149 | x_coord = move.split()[0] |
lsaristo | 14:41fa8b95a9ab | 150 | x_coord_prev = prev.split()[0] |
lsaristo | 14:41fa8b95a9ab | 151 | y_coord = move.split()[1] |
lsaristo | 14:41fa8b95a9ab | 152 | y_coord_prev = prev.split()[1] |
lsaristo | 14:41fa8b95a9ab | 153 | |
lsaristo | 14:41fa8b95a9ab | 154 | # Remove redundant moveto's |
lsaristo | 14:41fa8b95a9ab | 155 | if x_coord != x_coord_prev or y_coord != y_coord_prev: |
lsaristo | 14:41fa8b95a9ab | 156 | output_list.append(move) |
lsaristo | 14:41fa8b95a9ab | 157 | prev = move |
lsaristo | 14:41fa8b95a9ab | 158 | |
lsaristo | 14:41fa8b95a9ab | 159 | # Flatten on x-coordinate |
lsaristo | 14:41fa8b95a9ab | 160 | filtered_moves = list(output_list) |
lsaristo | 14:41fa8b95a9ab | 161 | output_list = [filtered_moves.pop(0)] |
lsaristo | 14:41fa8b95a9ab | 162 | prev = filtered_moves.pop(0) |
lsaristo | 14:41fa8b95a9ab | 163 | prev_s = prev.split() |
lsaristo | 14:41fa8b95a9ab | 164 | prev_y = prev_s[1] |
lsaristo | 14:41fa8b95a9ab | 165 | prev_x = prev_s[0] |
lsaristo | 14:41fa8b95a9ab | 166 | while filtered_moves: |
lsaristo | 14:41fa8b95a9ab | 167 | move = filtered_moves.pop(0) |
lsaristo | 14:41fa8b95a9ab | 168 | move_s = move.split() |
lsaristo | 14:41fa8b95a9ab | 169 | move_x = move_s[0] |
lsaristo | 14:41fa8b95a9ab | 170 | move_y = move_s[1] |
lsaristo | 14:41fa8b95a9ab | 171 | move_c = move_s[2] |
lsaristo | 14:41fa8b95a9ab | 172 | |
lsaristo | 14:41fa8b95a9ab | 173 | if move_c == 'moveto': |
lsaristo | 14:41fa8b95a9ab | 174 | output_list.append(prev) |
lsaristo | 14:41fa8b95a9ab | 175 | prev = None |
lsaristo | 14:41fa8b95a9ab | 176 | output_list.append(move) |
lsaristo | 14:41fa8b95a9ab | 177 | continue |
lsaristo | 14:41fa8b95a9ab | 178 | |
lsaristo | 14:41fa8b95a9ab | 179 | if prev and move_x == prev_x: |
lsaristo | 14:41fa8b95a9ab | 180 | prev_y = move_y |
lsaristo | 14:41fa8b95a9ab | 181 | continue |
lsaristo | 14:41fa8b95a9ab | 182 | |
lsaristo | 14:41fa8b95a9ab | 183 | if prev: |
lsaristo | 14:41fa8b95a9ab | 184 | output_list.append(prev) |
lsaristo | 14:41fa8b95a9ab | 185 | prev = move |
lsaristo | 14:41fa8b95a9ab | 186 | prev_s = prev.split() |
lsaristo | 14:41fa8b95a9ab | 187 | prev_y = prev_s[1] |
lsaristo | 14:41fa8b95a9ab | 188 | prev_x = prev_s[0] |
lsaristo | 14:41fa8b95a9ab | 189 | if prev: output_list.append(prev) |
lsaristo | 14:41fa8b95a9ab | 190 | |
lsaristo | 14:41fa8b95a9ab | 191 | # Flatten on y-coordinate |
lsaristo | 14:41fa8b95a9ab | 192 | filtered_moves = list(output_list) |
lsaristo | 14:41fa8b95a9ab | 193 | output_list = [filtered_moves.pop(0)] |
lsaristo | 14:41fa8b95a9ab | 194 | prev = filtered_moves.pop(0) |
lsaristo | 14:41fa8b95a9ab | 195 | prev_s = prev.split() |
lsaristo | 14:41fa8b95a9ab | 196 | prev_y = prev_s[1] |
lsaristo | 14:41fa8b95a9ab | 197 | prev_x = prev_s[0] |
lsaristo | 14:41fa8b95a9ab | 198 | while filtered_moves: |
lsaristo | 14:41fa8b95a9ab | 199 | move = filtered_moves.pop(0) |
lsaristo | 14:41fa8b95a9ab | 200 | move_s = move.split() |
lsaristo | 14:41fa8b95a9ab | 201 | move_x = move_s[0] |
lsaristo | 14:41fa8b95a9ab | 202 | move_y = move_s[1] |
lsaristo | 14:41fa8b95a9ab | 203 | move_c = move_s[2] |
lsaristo | 14:41fa8b95a9ab | 204 | |
lsaristo | 14:41fa8b95a9ab | 205 | if move_c == 'moveto': |
lsaristo | 14:41fa8b95a9ab | 206 | output_list.append(prev) |
lsaristo | 14:41fa8b95a9ab | 207 | prev = None |
lsaristo | 14:41fa8b95a9ab | 208 | output_list.append(move) |
lsaristo | 14:41fa8b95a9ab | 209 | continue |
lsaristo | 14:41fa8b95a9ab | 210 | |
lsaristo | 14:41fa8b95a9ab | 211 | if prev and move_y == prev_y: |
lsaristo | 14:41fa8b95a9ab | 212 | prev_x = move_x |
lsaristo | 14:41fa8b95a9ab | 213 | continue |
lsaristo | 14:41fa8b95a9ab | 214 | if prev: |
lsaristo | 14:41fa8b95a9ab | 215 | output_list.append(prev) |
lsaristo | 14:41fa8b95a9ab | 216 | prev = move |
lsaristo | 14:41fa8b95a9ab | 217 | prev_s = prev.split() |
lsaristo | 14:41fa8b95a9ab | 218 | prev_y = prev_s[1] |
lsaristo | 14:41fa8b95a9ab | 219 | prev_x = prev_s[0] |
lsaristo | 14:41fa8b95a9ab | 220 | if prev: output_list.append(prev) |
lsaristo | 14:41fa8b95a9ab | 221 | |
lsaristo | 14:41fa8b95a9ab | 222 | for move in output_list: |
lsaristo | 14:41fa8b95a9ab | 223 | x_coord = move.split()[0] |
lsaristo | 14:41fa8b95a9ab | 224 | y_coord = move.split()[1] |
lsaristo | 14:41fa8b95a9ab | 225 | cmd = move.split()[2] |
lsaristo | 14:41fa8b95a9ab | 226 | |
lsaristo | 14:41fa8b95a9ab | 227 | return output_list |
lsaristo | 14:41fa8b95a9ab | 228 | |
lsaristo | 12:1aa6b8a74136 | 229 | def b1down(event): |
lsaristo | 12:1aa6b8a74136 | 230 | global b1 |
lsaristo | 12:1aa6b8a74136 | 231 | b1 = "down" # you only want to draw when the button is down |
lsaristo | 12:1aa6b8a74136 | 232 | # because "Motion" events happen -all the time- |
lsaristo | 12:1aa6b8a74136 | 233 | |
lsaristo | 12:1aa6b8a74136 | 234 | def b1up(event): |
lsaristo | 12:1aa6b8a74136 | 235 | global b1, xold, yold |
lsaristo | 12:1aa6b8a74136 | 236 | b1 = "up" |
lsaristo | 12:1aa6b8a74136 | 237 | xold = None # reset the line when you let go of the button |
lsaristo | 12:1aa6b8a74136 | 238 | yold = None |
lsaristo | 12:1aa6b8a74136 | 239 | |
lsaristo | 12:1aa6b8a74136 | 240 | def motion(event): |
lsaristo | 12:1aa6b8a74136 | 241 | if b1 == "down": |
lsaristo | 12:1aa6b8a74136 | 242 | global xold, yold |
lsaristo | 12:1aa6b8a74136 | 243 | if xold is not None and yold is not None: |
lsaristo | 12:1aa6b8a74136 | 244 | event.widget.create_line(xold,yold,event.x,event.y,smooth=TRUE) |
lsaristo | 12:1aa6b8a74136 | 245 | xold = event.x |
lsaristo | 12:1aa6b8a74136 | 246 | yold = event.y |
lsaristo | 12:1aa6b8a74136 | 247 | |
lsaristo | 12:1aa6b8a74136 | 248 | def main(): |
lsaristo | 12:1aa6b8a74136 | 249 | """ Main program entry point """ |
lsaristo | 12:1aa6b8a74136 | 250 | loop() |
lsaristo | 12:1aa6b8a74136 | 251 | |
lsaristo | 12:1aa6b8a74136 | 252 | if __name__ == "__main__": |
lsaristo | 12:1aa6b8a74136 | 253 | main() |