Tracer un cercle sur un tkinter Canvas
se fait généralement par la méthode create_oval
. Cependant, fournir le cadre de sélection est souvent une manière déroutante de penser à dessiner un cercle. Ce n'est pas particulièrement difficile de trouver un raccourci pour cela, mais je ne pouvais trouver personne d'autre qui fasse quelque chose de similaire, alors je le posterai dans l'espoir que quelqu'un d'autre le trouve utile.
Voici une astuce appelée "correction de singe" dans laquelle nous ajoutons un membre à la classe Tkinter
de la classe Canvas
. Vous trouverez ci-dessous un programme pleinement fonctionnel (Python 2.7), dont le troisième paragraphe présente un intérêt. Ajoutez-le à votre code et vous pourrez traiter tk.Canvas.create_circle(x, y, r, options...)
comme une méthode intégrée, dans laquelle les options sont identiques à create_oval
. Nous faisons quelque chose de similaire pour create_arc
(quatrième paragraphe) et donnons la possibilité de spécifier un angle end
au lieu d'un extent
.
import Tkinter as tk
root = tk.Tk()
canvas = tk.Canvas(root, width=200, height=200, borderwidth=0, highlightthickness=0, bg="black")
canvas.grid()
def _create_circle(self, x, y, r, **kwargs):
return self.create_oval(x-r, y-r, x+r, y+r, **kwargs)
tk.Canvas.create_circle = _create_circle
def _create_circle_arc(self, x, y, r, **kwargs):
if "start" in kwargs and "end" in kwargs:
kwargs["extent"] = kwargs["end"] - kwargs["start"]
del kwargs["end"]
return self.create_arc(x-r, y-r, x+r, y+r, **kwargs)
tk.Canvas.create_circle_arc = _create_circle_arc
canvas.create_circle(100, 120, 50, fill="blue", outline="#DDD", width=4)
canvas.create_circle_arc(100, 120, 48, fill="green", outline="", start=45, end=140)
canvas.create_circle_arc(100, 120, 48, fill="green", outline="", start=275, end=305)
canvas.create_circle_arc(100, 120, 45, style="arc", outline="white", width=6, start=270-25, end=270+25)
canvas.create_circle(150, 40, 20, fill="#BBB", outline="")
root.wm_title("Circles and Arcs")
root.mainloop()
Résultat:
solution plus simple:
from tkinter import *
root = Tk()
myCanvas = Canvas(root)
myCanvas.pack()
def create_circle(x, y, r, canvasName): #center coordinates, radius
x0 = x - r
y0 = y - r
x1 = x + r
y1 = y + r
return canvasName.create_oval(x0, y0, x1, y1)
create_circle(100, 100, 20, myCanvas)
create_circle(50, 25, 10, myCanvas)
root.mainloop()