Itemconfig und der tag Parameter

Fragen zu Tkinter.
Antworten
4bit
User
Beiträge: 113
Registriert: Dienstag 5. Mai 2009, 11:27

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]
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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()
4bit
User
Beiträge: 113
Registriert: Dienstag 5. Mai 2009, 11:27

Achso, verstehe.
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

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?
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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.
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

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
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

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:
Take it easy Mates!
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

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
4bit
User
Beiträge: 113
Registriert: Dienstag 5. Mai 2009, 11:27

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.
Antworten