Seite 1 von 1

Tortengrafik verbergen

Verfasst: Montag 13. Oktober 2025, 05:18
von Cybernuschel
Hallo Allerseits,

ich habe da ein kleines Problem. In dem folgenden Code wird eine einfache Tortengrafik mit zwei Farben erstellt. Ich möchte die Torte in bestimmten Fällen unsichtbar machen, später soll sie wieder erscheinen. Kann mir da jemand auf die Sprünge helfen?

Vielen Dank

Gruß Cybernuschel

Code: Alles auswählen

import tkinter as tk

# Werte für die Tortengrafik
values = [30, 70]  # Anteile in Prozent
colors = ["red", "green"]  # Farben

# Tortengrafik zeichnen
def draw_pie_chart(canvas, data, colors, center, radius):
    start_angle = 0
    for i, value in enumerate(data):
        extent = 360 * (value / 100)
        canvas.create_arc(
            center[0] - radius, center[1] - radius,
            center[0] + radius, center[1] + radius,
            start=start_angle, extent=extent,
            fill=colors[i]
        )
        start_angle += extent

# Hauptfenster erstellen

root = tk.Tk()
root.title('Torte')
canvas = tk.Canvas(root, width = 600, height = 330, bg ="#F0FFFF")
canvas.grid()

# Tortengrafik anzeigen
draw_pie_chart(canvas, values, colors, (150, 200), 100) # Position x, Position y, Durchmesser

root.mainloop()

Re: Tortengrafik verbergen

Verfasst: Montag 13. Oktober 2025, 12:09
von DeaD_EyE
Leider hat tkinter kein show/hide, also muss man sich das selbst programmieren.
Jedenfalls ist diese Methode nicht so schön, weil alle vorherigen Widgets nachrücken, wenn das Canvas widget ausgeblendet wird.

Hier mal ein Beispiel:

Code: Alles auswählen

import tkinter as tk


def draw_pie_chart(
    root: tk.Tk,
    data: list[int],
    colors: list[str],
    center: tuple[int, int],
    radius: int,
) -> tk.Canvas:
    canvas = tk.Canvas(root, width=600, height=330, bg="#F0FFFF")

    start_angle = 0.0

    for i, value in enumerate(data):
        extent = 360 * (value / 100)
        canvas.create_arc(
            center[0] - radius,
            center[1] - radius,
            center[0] + radius,
            center[1] + radius,
            start=start_angle,
            extent=extent,
            fill=colors[i],
        )
        start_angle += extent

    return canvas


def toggle_visible(widget: tk.Widget):
    active = True
    info = widget.grid_info()

    def inner():
        nonlocal active

        if active:
            active = False
            widget.grid_forget()
        else:
            active = True
            widget.grid(**info)

    return inner


def main() -> None:
    values = [30, 70]
    colors = ["red", "green"]

    root = tk.Tk()
    root.title("Torte")
    canvas = draw_pie_chart(root, values, colors, center=(150, 200), radius=100)
    canvas.grid(row=1, column=1, columnspan=2)

    tk.Button(root, text="Toggle", command=toggle_visible(canvas)).grid(row=2, column=1)
    tk.Button(root, text="Exit", command=root.destroy).grid(row=2, column=2)

    root.mainloop()


if __name__ == "__main__":
    main()


Re: Tortengrafik verbergen

Verfasst: Montag 13. Oktober 2025, 12:53
von __blackjack__
@Cybernuschel: Was genau meinst Du denn damit das die Torte unsichtbar werden soll? DeaD_EyE hat gezeigt wie man den gesamten `Canvas` aus der GUI nehmen und wieder einfügen kann. Man kann aber auch Objekte auf dem Canvas verstecken und wieder sichtbar machen. Damit man das nicht für jedes Tortenstück einzeln machen muss, kann man Objekten auf dem Canvas auch ein gemeinsames „tag“ geben und die dann darüber ansprechen.

Der Index `i` wird übrigens nicht wirklich gebraucht, denn was man da ja eigentlich will, ist parallel über die beiden Sequenzen iterieren. Dafür gibt es die `zip()`-Funktion.

Code: Alles auswählen

#!/usr/bin/env python3
import tkinter as tk


def draw_pie_chart(canvas, data, colors, center, radius, tag):
    x, y = center
    start_angle = 0
    for value, color in enumerate(data, colors):
        extent = 360 * (value / 100)
        canvas.create_arc(
            x - radius,
            y - radius,
            x + radius,
            y + radius,
            start=start_angle,
            extent=extent,
            fill=color,
            tag=tag,
        )
        start_angle += extent


class MainWindow(tk.Tk):
    CHART_TAG = "chart"

    def __init__(self, values, colors):
        tk.Tk.__init__(self)
        self.is_chart_visible = True
        self.title("Torte")
        self.canvas = tk.Canvas(self, width=600, height=330, bg="#F0FFFF")
        self.canvas.pack()
        draw_pie_chart(
            self.canvas, values, colors, (150, 200), 100, self.CHART_TAG
        )
        tk.Button(self, text="Toggle", command=self.toggle_chart).pack()

    def toggle_chart(self):
        self.is_chart_visible = not self.is_chart_visible
        self.canvas.itemconfigure(
            self.CHART_TAG,
            state=tk.NORMAL if self.is_chart_visible else tk.HIDDEN,
        )


def main():
    values = [30, 70]  # Anteile in Prozent.
    assert sum(values) == 100
    colors = ["red", "green"]
    window = MainWindow(values, colors)
    window.mainloop()


if __name__ == "__main__":
    main()

Re: Tortengrafik verbergen

Verfasst: Dienstag 14. Oktober 2025, 18:55
von Cybernuschel
Erstmal vielen Dank für die beiden schnellen Antworten, ich wollte die gesamte Torte am Ort lassen jedoch verbergen und später wieder sichtbar machen.
Übrigens __blackjack__User dein Code verursacht bei mir leider einen Fehler.
Auf jeden sehe ich ein klein wenig klarer, habe das Problem aber noch nicht gelöst. Ich hatte tatsächlich gehofft, dass es so etwas wie ein show/hide gibt.
Vielleicht verdecke ich auch die ganze Torte durch ein Viereck.

Re: Tortengrafik verbergen

Verfasst: Dienstag 14. Oktober 2025, 19:20
von Sirius3
Wenn Du bei einem Fehler nicht weiter kommst, bitte poste hier die komplette Fehlermeldung und den dazugehörigen Code.
In Deinem Fall hat __blackjack__ `enumerate` mit `zip` verwechselt, was ein einfach zu behebender Fehler ist.
Ansonsten tut der Code exakt das, was Du möchtest.