Seite 1 von 1

Itemconfig und der tag Parameter

Verfasst: Freitag 8. Mai 2009, 13:33
von 4bit
Hi,

Das sind die typischen Momente, in denen ich meine Nerven verliere würde, wäre ich ein ungeduldiger Mensch:

Code: Alles auswählen

itemconfig("steady", fill="black")
itemconfig("paradise", fill="white")
funktionieren, aber

Code: Alles auswählen

itemconfig(("steady", "paradise"), fill="gray")
itemconfig(["steady", "paradiese"], fill="gray")
geben die Fehlermeldung TclError: unknown option "paradise".

Warum, oh warum nur?

Grüße,
[/4bit]

Re: Itemconfig und der tag Parameter

Verfasst: Freitag 8. Mai 2009, 14:10
von numerix
4bit hat geschrieben:Warum, oh warum nur?
Naja, weil itemconfig() als erstes Argument genau eine item-ID oder ein Tag erwartet, und nicht eine Liste oder ein Tupel davon.

Mögliche Lösung: Beim Erzeugen der entsprechenden items (oder auch nachträglich) ein weiteres Tag einsetzen, das alle Items erhalten, die gemeinsam verändert werden sollen. Dieses Tag wird dann für itemconfig verwendet. Also etwa so:

Code: Alles auswählen

import Tkinter as tk

root = tk.Tk()
canv = tk.Canvas(root, width=200, height=200)
canv.create_line(10,10,190,190, tags=("strich1","striche"))
canv.create_line(190,10,10,190, tags=("strich2","striche"))
canv.itemconfig("striche", fill="red")
canv.pack()
root.mainloop()

Verfasst: Freitag 8. Mai 2009, 14:20
von 4bit
Achso, verstehe.

Verfasst: Freitag 8. Mai 2009, 14:43
von yipyip
Also ich versteh's mal wieder nicht.
Anscheinend darf man für die Tags keine
Zahlenstrings benutzen:

(Experimentiercode)

Code: Alles auswählen

#!/usr/bin/env python

####

import Tkinter as tk

####
  
class Gui(object):


  def __init__(self, width=400, height=400):

    self.root = tk.Tk()
    self.canvas = tk.Canvas(self.root, width=width, height=height, bg='white',
                            highlightthickness=None)
        
    self.canvas.pack(fill=tk.BOTH, expand=True)
    self.button = tk.Button(self.root, text='Change', command=self.show)
    self.button.pack()

    self.state = 1
    self.item1 = self.canvas.create_rectangle(33, 33, 99, 99, fill='red')
    self.canvas.itemconfig(self.item1, tags=('a', 'x', '42'))

    self.item2 = self.canvas.create_rectangle(222, 222, 333, 333, fill='yellow')
    self.canvas.itemconfig(self.item2, tags=('b', 'x', '42'))

    print self.item1, self.item2
    print self.canvas.find_withtag('x')
    print self.canvas.find_withtag('42')
    print self.canvas.gettags(self.item1)
    print self.canvas.gettags(self.item2)
    

  def show(self):

    self.state ^= 1
    # mit 'a', 'b' oder 'x' erwartetes Verhalten, mit '42' ???
    self.canvas.itemconfig('x', fill=('black', 'grey')[self.state])
    
     
  def run(self):

    self.root.mainloop()

####

if __name__ == '__main__':

  Gui().run()
  
Mit den Tags 'a', 'b' und 'x' funktioniert es, aber der Tag '42'
wird nicht erkannt.

Liegt das am Tcl?

Verfasst: Freitag 8. Mai 2009, 14:49
von numerix
yipyip hat geschrieben:Also ich versteh's mal wieder nicht.
Anscheinend darf man für die Tags keine
Zahlenstrings benutzen: Mit den Tags 'a', 'b' und 'x' funktioniert es, aber der Tag '42' wird nicht erkannt. Liegt das am Tcl?
Woran es liegt, weiß ich nicht; ich kann es auf jeden Fall reproduzieren.
Eine wirkliche Einschränkung ist das aber nun ja auch nicht. In der Regel wird man die Namen für Tags doch so wählen, dass sie inhaltlich sinnvoll sind - mit Zahlen allein gelingt das wohl nur in seltenen Fällen.

Verfasst: Freitag 8. Mai 2009, 14:55
von yipyip
Klar, man kann damit leben, aber mir ging es ja nur
ums Prinzip.
(Ich bin wohl der einzige gewesen, der es zuerst mit einem
Zahlenstring ausprobiert hatte...)

:wink:
yipyip

Verfasst: Freitag 8. Mai 2009, 15:46
von wuf
Hallo yipyip

Habe ich auch schon einmal festgestellt. Das muss auch unseren Tutoren Shipman & Fredrik Lundh (Effbot) nicht aufgefallen sein. :o

Ein Canvas Grafik-Objekt (Rechteck, Line usw.) gib bei dessen Erzeuglung eine Integer-Nummer zurück. Fortlaufend nummeriert wie die Objekte erzeugt werden. Scheinbar wird diese Integer-Objektnummer bei Verwendung als Tag bei einer der Canvas-Objekt Methode Tcl-intern in einen String umgewandelt, da Tags für Tcl String-Objekte sind. Du kannst das am folgenden Testsnippet kontrollieren:

Code: Alles auswählen

import Tkinter as tk

app_win = tk.Tk()

canvas = tk.Canvas(app_win, width=150, height=150)
canvas.pack()
rectangle_id = canvas.create_rectangle(10,10,50,50)
canvas.itemconfigure(str(rectangle_id), fill='steelblue3')

app_win.mainloop()
Gruss wuf :wink:

Verfasst: Freitag 8. Mai 2009, 15:56
von yipyip
Ich ahnte schon sowas.
Das darunterliegende Tcl macht sich doch stärker
bemerkbar als ich ursprünglich dachte.

Nochmals Danke an Dich und numerix.

:wink:
yipyip

Verfasst: Freitag 8. Mai 2009, 15:59
von 4bit
Hatte nicht damit gerechnet, daß ich heute noch eine Erklärung dafür bekomme, warum Tags, die sich auch als Integer interpretieren lassen unter Umständen nicht das Ergebnis liefern, das man erwartet.
Bei mir war das Problem nämlich auch aufgetreten und ich konnte es nur damit lösen, einen Buchstaben vor die Integer-String Tags zu hängen.

Danke wuf,

4bit.