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:

this

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:

screenshot of image created current code

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:

screenshot showing output

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

Popular posts from this blog

resizing Telegram inline keyboard -

command line - How can a Python program background itself? -

php - "cURL error 28: Resolving timed out" on Wordpress on Azure App Service on Linux -