python - How to draw an arc on a tkinter canvas? -
i'm studying automata theory , requested program graph (tree) of automaton looks more or less like:
so far got (i'm using tkinter
, canvas
draw):
from tkinter import tk, canvas, mainloop def circle(canvas, x, y, r, width): id = canvas.create_oval (x-r, y-r, x+r, y+r, width = width) return id def line (canvas, x1, y1, x2, y2, width): canvas.create_line (x1, y1, x2, y2, width = width) def text (canvas, x, y, text): canvas.create_text (x, y, text = text, font = ("bold", 20)) w = canvas(tk (), width=1000, height=600, bg = "white") circle (w , 150, 300, 70, 3) circle (w , 150, 300, 50, 3) circle (w , 370, 300, 70, 3) circle (w , 640, 300, 70, 3) circle (w , 910, 300, 70, 3) line (w, 10, 300, 80, 300, 3) circle (w, 73, 300, 5, 6) line (w, 220, 300, 300, 300, 3) circle (w, 293, 300, 5, 6) line (w, 440, 300, 570, 300, 3) circle (w, 567, 300, 5, 6) line (w, 710, 300, 840, 300, 3) circle (w, 837, 300, 5, 6) text (w, 150, 300, "q0") text (w, 370, 300, "q1") text (w, 640, 300, "q2") text (w, 910, 300, "q3") w.pack() mainloop()
which displays this:
i don't need arrows, because use dots instead. problem need draw line circle q3 circle q0, , circle q0 circle q0, (a "bucle"). tried canvas.create_arc()
method, can't handle of it. there alternative? ideas on how draw "bucle"?
here's utility functions provide alternative way draw arcs on tkinter.canvas
. instead of usual specification of two-points, (x0, y0)
, (x1, y1)
define enclosing rectangle, arc functions accept starting , stopping angle in open range of [0..360)
degrees.
it illustrates how have arrowheads drawn @ ends of straight lines (but not arcs) since asked that, too.
from tkinter import canvas, mainloop, tk def circle(canvas, x, y, r, width): return canvas.create_oval(x+r, y+r, x-r, y-r, width=width) def circular_arc(canvas, x, y, r, t0, t1, width): return canvas.create_arc(x-r, y-r, x+r, y+r, start=t0, extent=t1-t0, style='arc', width=width) def ellipse(canvas, x, y, r1, r2, width): return canvas.create_oval(x+r1, y+r2, x-r1, y-r2, width=width) def elliptical_arc(canvas, x, y, r1, r2, t0, t1, width): return canvas.create_arc(x-r1, y-r2, x+r1, y+r2, start=t0, extent=t1-t0, style='arc', width=width) def line(canvas, x1, y1, x2, y2, width, start_arrow=0, end_arrow=0): arrow_opts = start_arrow << 1 | end_arrow arrows = {0b10: 'first', 0b01: 'last', 0b11: 'both'}.get(arrow_opts, none) return canvas.create_line(x1, y1, x2, y2, width=width, arrow=arrows) def text(canvas, x, y, text): return canvas.create_text(x, y, text=text, font=('bold', 20)) w = canvas(tk(), width=1000, height=600, bg='white') circle(w, 150, 300, 70, 3) # q0 outer edge circle(w, 150, 300, 50, 3) # q0 inner edge circle(w, 370, 300, 70, 3) # q1 circle(w, 640, 300, 70, 3) # q2 circle(w, 910, 300, 70, 3) # q3 # draw arc circle q3 q0. midx, midy = (150+910) / 2, 300 r1, r2 = 910-midx, 70+70 elliptical_arc(w, midx, midy, r1, r2, 30, 180-30, 3) line(w, 10, 300, 80, 300, 3, end_arrow=1) line(w, 220, 300, 300, 300, 3, end_arrow=1) line(w, 440, 300, 570, 300, 3, end_arrow=1) line(w, 710, 300, 840, 300, 3, end_arrow=1) text(w, 150, 300, 'q0') text(w, 370, 300, 'q1') text(w, 640, 300, 'q2') text(w, 910, 300, 'q3') w.pack() mainloop()
this draws:
it doesn't draw "buckle" want partly because drawing "a line circle q3 circle q0, , circle q0 circle q0" isn't illustration @ beginning of question 1 drawn between 2 circles (if understand correctly meant term).
however, provide way draw arcs on canvas
.
Comments
Post a Comment