web-dev-qa-db-fra.com

Tracez un cercle dans Tkinter (Python)

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.

18
mgold

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:

result of code

37
mgold

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()
0
Edgar Runnman