Objekte auf Canvas verstecken/anzeigen

Fragen zu Tkinter.
Antworten
pyzip
User
Beiträge: 89
Registriert: Freitag 16. Juni 2017, 19:36

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
Benutzeravatar
__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
pyzip
User
Beiträge: 89
Registriert: Freitag 16. Juni 2017, 19:36

Ja, scheint aber nicht mit "Tag" zu klappen. Canvas.itemconfigure(tag=("grid"), state = tk.HIDDEN)() geht nicht. Sollte aber alle Objekte mit tag="grid" verstecken...
pyzip
User
Beiträge: 89
Registriert: Freitag 16. Juni 2017, 19:36

Vielleiecht zu meinem Verständis, canv.delete("grid"), wobei "grid" mein tag ist, entfernt alle Objekte mit tag="grid". Ok, aber muß ich das ganze Koordinatenkreuz dann wirklich neu zeichnen??
Benutzeravatar
__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
pyzip
User
Beiträge: 89
Registriert: Freitag 16. Juni 2017, 19:36

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
Benutzeravatar
__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.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
pyzip
User
Beiträge: 89
Registriert: Freitag 16. Juni 2017, 19:36

Vielleicht habe ich ja auch nur das Missverständnis, was "delete tag" betrifft. Muß ich wirklich alle Objekte(mit tag=xy) nach "del tag" neu zeichnen? Oder sind die im Hintegrund doch noch da?
Danke, pazip
pyzip
User
Beiträge: 89
Registriert: Freitag 16. Juni 2017, 19:36

...offensichtlich geht meine Frage ins Nichts!? Ich versuche es gleich neu...
Danke für die Geduld...
pyzip
Benutzeravatar
__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
Benutzeravatar
peterpy
User
Beiträge: 188
Registriert: Donnerstag 7. März 2013, 11:35

Hallo pyzip
=pyzip post_id=368015 time=1591395819 user_id=18874]
...offensichtlich geht meine Frage ins Nichts!
__blackjack__ hat dir doch schon vorher geantwortet.
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() 
Gruss
Peter
Antworten