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

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

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

Ä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

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

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
Antworten