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