canvas.itemconfigure(...) hängt?

Fragen zu Tkinter.
Benutzeravatar
Hannes-Spz
User
Beiträge: 123
Registriert: Sonntag 7. August 2005, 22:42

canvas.itemconfigure(...) hängt?

Beitragvon Hannes-Spz » Mittwoch 23. August 2006, 17:35

hi leutz!
sicher gibt es hier schon tausende threads in welchen sich die idle oder was anderes aufhängt... aber da ich nichts gefunden hab, was mir dabei hilft:
wenn ich die zeile, in welcher der tag "TEXT" geändert wird, kommentiere, läufts flüssiger als wasser - wenn nicht, dann brauche ich nur mit der maus von einer kreishälfte in die andere gehen wollen und schon geht absolut nix mehr :?

mein code:

Code: Alles auswählen

from Tkinter import *
root = Tk()
cv = Canvas(root)
x1 = y1 = 20
x2 = y2 = 200

def _poschange(x):
    "nimmt aenderung an sich vor"
   st, ext, st2, ext2 = 0 - x, 180 + 2 * x, 180 + x, 180 - 2 * x
   cv.itemconfigure("eventbutton", start = st, extent = ext)
   cv.itemconfigure("terminbutton", start = st2, extent = ext2)

def _evbutton(event):
    "vergroessert den orangenen halbkreis und verkleinert den blauen"
   _poschange( x = 20 ) # zwanzig grad mehr
   cv.itemconfigure("TEXT", text = "Event", fill = "white")
def _terbutton(event):
    "vergroessert den blauen halbkreis und verkleinert den orangenen"
   _poschange( x = -20 )# zwanzig grad weniger
   cv.itemconfigure("TEXT", text = "Termin", fill = "black")
def _norm(event):
    "stellt wieder zwei 'normale' halbkreise her"
   _poschange( x = 0 )  # trennlinie = durchmesser
   cv.itemconfigure("TEXT", text = "")

ko = cv.create_arc(x1,y1,x2,y2,start=0,
            extent=180,outline="darkblue"
            ,fill="darkblue",style="chord",
            tag="eventbutton")
ku = cv.create_arc(x1,y1,x2,y2,start=180,
            extent=180,outline="orange",
            fill="orange",style="chord",
            tag="terminbutton")
la = cv.create_text( (x2-x1)/2+x1, (y2-y1)/2+y1, text = "", tag = "TEXT",
            font = ("Arial", 20, "bold") )

cv.tag_bind("eventbutton","<Enter>",_evbutton)
cv.tag_bind("terminbutton","<Enter>",_terbutton)
cv.tag_bind("eventbutton","<Leave>",_norm)
cv.tag_bind("terminbutton","<Leave>",_norm)

cv.pack()
root.mainloop()


kann mir jemand dabei helfen?

grundprinzip:
die buttons sollten sich xp-theme- / flash-like verändern (vergrößern oder aufhellen)
dabei sollte dann gleich noch angezeigt werden, was der button an sich macht (TEXT)
danach sollte beim draufklicken eine funktion ähnlich eines buttons aufgeführt werden!
( --> alles mit .create_arc(...) )

liebe grüße und vielen dank im voraus
hannes
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Beitragvon HWK » Mittwoch 23. August 2006, 23:10

Ändere das Script einmal folgendermaßen:

Code: Alles auswählen

from Tkinter import *
root = Tk()
cv = Canvas(root)
x1 = y1 = 20
x2 = y2 = 200

def _poschange(x):
    "nimmt aenderung an sich vor"
    st, ext, st2, ext2 = 0 - x, 180 + 2 * x, 180 + x, 180 - 2 * x
    cv.itemconfigure("eventbutton", start=st, extent=ext)
    cv.itemconfigure("terminbutton", start=st2, extent=ext2)

def _evbutton(event):
    "vergroessert den orangenen halbkreis und verkleinert den blauen"
    print 'ev'
    _poschange(x=20) # zwanzig grad mehr
    cv.itemconfigure("TEXT", text="Event", fill="white")
def _terbutton(event):
    "vergroessert den blauen halbkreis und verkleinert den orangenen"
    print 'ter'
    _poschange(x=-20) # zwanzig grad weniger
    cv.itemconfigure("TEXT", text="Termin", fill="black")
def _norm(event):
    "stellt wieder zwei 'normale' halbkreise her"
    print 'norm'
##    x = event.x - (x1 + x2) / 2
##    y = event.y - (y1 + y2) / 2
##    if x * x + y * y <= ((x2 - x1) / 2) ** 2:
##        return
    _poschange(x=0) # trennlinie=durchmesser
    cv.itemconfigure("TEXT", text="")

ko = cv.create_arc(x1,y1,x2,y2,start=0,
                extent=180,outline="darkblue"
                ,fill="darkblue",style="chord",
                tag="eventbutton")
ku = cv.create_arc(x1,y1,x2,y2,start=180,
                extent=180,outline="orange",
                fill="orange",style="chord",
                tag="terminbutton")
la = cv.create_text((x2-x1)/2+x1, (y2-y1)/2+y1, text="", tag="TEXT",
                font=("Arial", 20, "bold"))

cv.tag_bind("eventbutton","<Enter>",_evbutton)
cv.tag_bind("terminbutton","<Enter>",_terbutton)
cv.tag_bind("eventbutton","<Leave>",_norm)
cv.tag_bind("terminbutton","<Leave>",_norm)

cv.pack()
root.mainloop()
Wenn Du es jetzt startest, solltest Du erkennen, was schief läuft. Dann beseitige die Kommentarzeichen in Zeile 26-29. Dadurch wird die Endlosschleife vermieden, da das Verlassen einer Buttonhälfte nur noch bearbeitet wird, wenn man den Button komplett verläßt.
MfG
HWK
Benutzeravatar
Hannes-Spz
User
Beiträge: 123
Registriert: Sonntag 7. August 2005, 22:42

Beitragvon Hannes-Spz » Donnerstag 24. August 2006, 09:55

vielen dank - auch wenn ich die formel da noch nicht wirklich verstanden habe :)
wenn du noch 10min zeit hast, wäre ich dir dankbar, wenn du sie mir kurz erklärst ;)
lg hannes
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Beitragvon HWK » Freitag 25. August 2006, 12:37

Sie überprüft einfach, ob der Mauszeiger innerhalb des Kreises liegt. _poschange(0) wird also nur beim Verlassen des Kreises durchgeführt, was die Endlosschleife verhindert.
MfG
HWK

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder