web-dev-qa-db-de.com

Kreis in Tkinter (Python) zeichnen

Das Zeichnen eines Kreises auf einem tkinter Canvas erfolgt normalerweise mit der create_oval-Methode. Die Bereitstellung des Begrenzungsrahmens ist jedoch oft eine verwirrende Art, über das Zeichnen eines Kreises nachzudenken. Es ist nicht besonders schwierig, eine Abkürzung dafür zu finden, aber ich konnte niemanden finden, der etwas Ähnliches macht, also poste ich es in der Hoffnung, dass jemand anderes es nützlich findet.

18
mgold

Hier ist ein Trick, der als "Affen-Patching" bezeichnet wird, bei dem wir der Tkinter-Klasse Canvas tatsächlich ein Mitglied hinzufügen. Unten ist ein voll funktionsfähiges Programm (Python 2.7), von dem der dritte Absatz von Interesse ist. Fügen Sie es Ihrem Code hinzu und Sie können tk.Canvas.create_circle(x, y, r, options...) wie eine eingebaute Methode behandeln, wobei die Optionen mit create_oval identisch sind. Wir machen etwas Ähnliches für create_arc (vierter Absatz) und geben die Option an, einen end-Winkel anstelle einer extent anzugeben.

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()

Ergebnis:

result of code

37
mgold

einfachere Lösung:

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