# # draw_polylines.py # # CREATED: 2023.04.19 ABS written by ChatGPT # MODIFIED: 2023.04.19 ABS tweaked, added menu code # MODIFIED: 2023.04.20 ABS tweaked, got Save working (.vect format), button 2 # MODIFIED: 2023.04.21 ABS debugged button 2 (right click); added buggy Clear # MODIFIED: 2023.04.26 ABS debugged Clear; added clumsy clipping # # prompt: # # Write a program in Python 2.7 to create a GUI with a drawing canvas where # the user can draw a polyline by clicking points in rubber band mode. # # ChatGPT: # # I'm sorry, but as a language model, I don't have the capability to create a # GUI with a drawing canvas on my own. However, I can provide you with some # guidance on how to create a GUI with a drawing canvas in Python 2.7. # # One way to create a GUI with a drawing canvas in Python 2.7 is to use the # Tkinter module. Here's an example program that creates a canvas and allows # the user to draw a polyline by clicking points in rubber band mode: [code] # # ToDo: get menus working: # [X] Save # [X] Clear # # [_] New # [_] Open # [_] Save as... # [_] Close from Tkinter import * class RubberBandCanvas(Canvas): def __init__(self, master=None, **kwargs): Canvas.__init__(self, master, width=512, height=512, **kwargs) self.bind("", self.on_move) self.bind("", self.on_button1_press) self.bind("", self.on_button1_release) self.bind("", self.on_button2_press) self.bind("", self.on_button2_release) self.line = None def on_move(self, event): global ClearFlag global pline if (ClearFlag): pline = [] pline.append((event.x, event.y)) ClearFlag = False print "# checkpoint 2" self.delete(self.line) # clipping if (event.x >= 0 and event.x < 512 and event.y >= 0 and event.y < 512): self.line = self.create_line(pline + [(event.x, event.y)], fill="black") print "drawing", event.x,event.y else: self.line = self.create_line(pline, fill="red") print "clipping", event.x,event.y def on_button1_press(self, event): global pline pline.append((event.x, event.y)) def on_button1_release(self, event): global pline self.delete(self.line) self.create_line(pline + [(event.x, event.y)], fill="green") def on_button2_press(self, event): global pline pline.pop() def on_button2_release(self, event): global pline self.delete('all') # self.create_line(pline + [(event.x, event.y)], fill="black") self.create_line(pline, fill="blue") class Application(Frame): def create_widgets(self): self.canvas = RubberBandCanvas(self) self.canvas.config(bg = "cyan") self.canvas.pack(fill=BOTH, expand=YES) # self.canvas.focus_set() def __init__(self, master=None): Frame.__init__(self, master) self.pack() self.create_widgets() def donothing(): filewin = Toplevel(root) button = Button(filewin, text="Do nothing button") button.pack() def save_points(): global pline print len(pline) - 1 for i_point in range(0, len(pline) - 1): print pline[i_point][0], pline[i_point][1], 0, print pline[i_point + 1][0], pline[i_point + 1][1], 0 def clear_points(): global ClearFlag global pline app.canvas.delete('all') pline = [] # pline.append((event.x, event.y)) ClearFlag = True print "# checkpoint 3" # START main pline = [] ClearFlag = False print "# checkpoint 1" root = Tk() menubar = Menu(root) filemenu = Menu(menubar, tearoff=0) print "# checkpoint X" filemenu.add_command(label="New", command=donothing) print "# checkpoint Y" filemenu.add_command(label="Open", command=donothing) print "# checkpoint Z" filemenu.add_command(label="Save", command=save_points) filemenu.add_command(label="Save as...", command=donothing) filemenu.add_command(label="Close", command=donothing) filemenu.add_separator() filemenu.add_command(label="Exit", command=root.quit) menubar.add_cascade(label="File", menu=filemenu) editmenu = Menu(menubar, tearoff=0) editmenu.add_separator() editmenu.add_command(label="Clear", command=clear_points) menubar.add_cascade(label="Edit", menu=editmenu) helpmenu = Menu(menubar, tearoff=0) root.config(menu=menubar) app = Application() app.master.title("Draw Polylines in Rubber Band Mode") app.mainloop() root.mainloop() # END main