Hallo, ich hoffe, meine Frage kann auch ohne Code beantwortet werden. Ich habe ein Canvas (auf root) definiert und zeichne nun ein Punkt-Raster darauf (canvas.create_oval) mit tag="grid". Möchte nun das Raster auf der Zeichenfläche sichtbar haben oder nicht. Mit "canv.delete("grid") geht das. Wenn ich das Raster wieder haben möchte, rufe ich die Funktion, die das Raster erzeugt erneut auf. Aber, mir ist nicht klar, ob ich das nicht einfacher mit "hide, show" oder etwas ähnlichem haben kann!?
Danke und Gruß, pyzip
Objekte auf Canvas verstecken/anzeigen
- __blackjack__
- User
- Beiträge: 13119
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@pyzip: Die Grafikobjekte haben eine "state"-Option, die man mit `Canvas.itemconfigure()` beispielsweise auf `tkinter.NORMAL` oder `tkinter.HIDDEN` setzen kann.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
- __blackjack__
- User
- Beiträge: 13119
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@pyzip: Natürlich geht das mit ``Canvas.itemconfigure(tag=("grid"), state = tk.HIDDEN)()`` nicht. Das ruft man nicht auf der Klasse auf, das gibt nichts aufrufbares zurück, Du übergibst nicht welches/welche Grafikobjekt(e) da eigentlich konfiguriert werden sollen, und wenn Du das "grid"-Tag angeben würdest, macht es keinen Sinn den Objekten ein `tag` mit dem Wert "grid" zu konfigurieren, denn diesen Wert haben die ja bereits. Und ”geht nicht” ist keine sinnvolle Fehlerbeschreibung, denn selbst diese sehr falsche Zeile führt zu einem `TypeError` mit einer aussagekräftigen Meldung:
Code: Alles auswählen
In [143]: tk.Canvas.itemconfigure(tag="grid", state=tk.HIDDEN)()
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-143-260a8ba0f6b8> in <module>
----> 1 tk.Canvas.itemconfigure(tag=("grid"), state = tk.HIDDEN)()
TypeError: itemconfigure() missing 2 required positional arguments: 'self' and 'tagOrId'
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
ja, ok, ich habe die Funktion "make_grid()", das zeichnet meine Punkte mit tag="grid". Dann versuche ich "canv.itemconfigure(tag=( "grid"), state = tk.HIDDEN) und es geht nicht. Da es aber mit "delete("grid") " geht , ist die Syntax wohl in Ordnung. Muß ich nach "delete" wirklich alles neu zeichnen??? Oder mache ich mir da unnötige Sorgen? IN meiner App werden recht viele Objekte gezeichnet werden und ich dachte, dass man die nicht immer löschen und neu zeichnen muß .
Gruß pyzip
Gruß pyzip
- __blackjack__
- User
- Beiträge: 13119
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@pyzip: Das geht nicht weil Du es falsch aufrufst. Du musst es halt richtig aufrufen. Wenn man es so aufruft wie Du es *jetzt* beschreibst, bekommt man ja immer noch eine Ausnahme, und die sagt was fehlt. Und es ist halt immer noch unsinnig die `tag`-Option auf den Wert "grid" setzen zu wollen, wenn die Elemente genau dieses Tag bereits besitzen.
Du kannst natürlich auch die Elemente löschen und dann später wieder neu zeichnen. Dabei ändert sich die Reihenfolge der Elemente, also auch was vor und was hinter diesen Punkten gezeichnet wird. Falls das wichtig ist. Kann man natürlich auch ändern, aber es wird halt immer mehr Code, wo eigentlich die `state`-Option ausreichen würde.
Du kannst natürlich auch die Elemente löschen und dann später wieder neu zeichnen. Dabei ändert sich die Reihenfolge der Elemente, also auch was vor und was hinter diesen Punkten gezeichnet wird. Falls das wichtig ist. Kann man natürlich auch ändern, aber es wird halt immer mehr Code, wo eigentlich die `state`-Option ausreichen würde.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
- __blackjack__
- User
- Beiträge: 13119
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@pyzip: Wieso geht Deine Frage ins Nichts? Ich habe beantwortet wie man das macht. Und dass man natürlich auch löschen und neu zeichnen kann wenn man unbedingt will, aber dass das mehr Code ist als einfach den dafür vorgesehenen Weg zu gehen. Man muss halt die Methode richtig verwenden und a) das fehlende Argument übergeben und b) kann man sich den Unsinn mit dem `tag` setzen sparen.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Hallo pyzip
Solltest Du wieder einmal zu wenig Geduld haben, schau hier nach:
https://effbot.org/tkinterbook/
Und bedenke, alles basiert hier auf freiwilliger Basis.
Wenn Du eine Antwort nicht verstehst, frag doch nach....
Zu deinem Problem hier ein Beispiel:
Gruss
Peter
__blackjack__ hat dir doch schon vorher geantwortet.=pyzip post_id=368015 time=1591395819 user_id=18874]
...offensichtlich geht meine Frage ins Nichts!
Solltest Du wieder einmal zu wenig Geduld haben, schau hier nach:
https://effbot.org/tkinterbook/
Und bedenke, alles basiert hier auf freiwilliger Basis.
Wenn Du eine Antwort nicht verstehst, frag doch nach....
Zu deinem Problem hier ein Beispiel:
Code: Alles auswählen
from tkinter import Tk, Canvas, Button
def verstecke():
canvas.itemconfigure("linie", state="hidden")
def zeige():
canvas.itemconfigure("linie", state="normal")
root = Tk()
canvas = Canvas(root, width= 200, height =200)
canvas.grid(column=0, columnspan=2,row=0)
for y in range (10, 190,10):
linien = canvas.create_line(10+y, y, 190-y, y, tags="linie")
Button(root, bd=3, command=verstecke,text="Verstecke").grid(column=1, row=1)
Button(root, bd=3, command=zeige, text="Zeige").grid(column=0, row=1)
root.mainloop()
Peter