hi wuf!
also ich habe mich ziemlich lang damit herumgeschlagen mein script mit deinem zusammenzufügen.aber ich denke da sind die ansätze einfach zu verschieden. so habe ich mich entschieden dein script weiterzuverfolgen, denn es ist halt einfach gut und im grunde ist es auch logischer (und um einiges einfacher), wenn man erstmal weiß wieviele nützliche methoden das Canvas Widget hat. wieso also nicht von anderen lernen?
jetzt hab ich mal probiert die Zahl, die jetzt rechts vom Abakus steht( also alle Zahlen, die ja wenn man sie von oben nach unten anschaut) als die gerade angezeigte Zahl in einem Text (namens sum) zu schreiben. Dies dient der Tatsache, dass ich dann schauen kann, ob der Benutzer, wenn ich ihm ne Aufgabe so wie etwa 15+25 vorsetze und er auf fertig klickt, ob es auch fertig ist.
dass klappt soweit alles.Ich füge jetzt noch den Aufgabensteller in den Script ein.
um die gerade angezeigte zahl zu kriegen habe folgendes gemacht:
Code: Alles auswählen
from Tkinter import *
def MoveRight(perle):
#~~ Schiebt Objekte nach rechts
#~~ Hilfsliste deklarieren
auxlist = []
pos = cv.bbox(perle)
#~~ Objektnummern der Perlen auf der rechten Seite
# der angeklickten Perle inklusive der angeklickten.
auxlist = list(cv.find_enclosed(pos[0],pos[1],right,pos[3]))
auxlist.reverse()
for obj in auxlist:
pos = cv.bbox(obj)
enclosed = cv.find_enclosed(pos[0]+r,pos[1],pos[2]+r,pos[3])
if enclosed == ():
if pos[0] < numcol*s:
cv.move(obj,+s,0)
cv.itemconfigure(obj,fill="darkolivegreen3")
UpdateNumOfPearls()
return()
def MoveLeft(perle):
#~~ Schiebt Objekte nach links
#~~ Hilfsliste deklarieren
auxlist = []
pos = cv.bbox(perle)
#~~ Objektnummern der Perlen auf der linken Seite
# der angeklickten Perle inklusive der angeklickten.
auxlist = list(cv.find_enclosed(left-1,pos[1],pos[2],pos[3]))
for obj in auxlist:
pos = cv.bbox(obj)
enclosed = cv.find_enclosed(pos[0]-r,pos[1],pos[2]-r,pos[3])
if enclosed == ():
if pos[0] > s:
cv.move(obj,-s,0)
cv.itemconfigure(obj,fill="green")
UpdateNumOfPearls()
return()
def UpdateNumOfPearls():
#~~ Aktualisiert Texte auf der Canvasfläche
global cleanmessage
global zusammen
zusammen = ''
yg = 0
cleaning = FALSE
for row in range(numrows):
y0 = s+yg+row*r
y1 = s+yg+(row+1)*r
foundobj = cv.find_enclosed(left-1,y0-1,right,y1+1)
numpearls = 0
numcolor = 'blue'
for obj in foundobj:
fillcolor = cv.itemcget(obj,'fill')
if fillcolor == 'darkolivegreen3':
numpearls += 1
if numpearls == numcol:
cleaning = TRUE
numcolor = 'red'
xpos = right+15
ypos = top+1+yg+r/2+row*r
try:
cv.delete(numlist[row])
except:
pass
numlist[row] = cv.create_text(xpos,ypos,text=numpearls,anchor='w',fill=numcolor,font=font1)
yg += gap
zusammen = zusammen + str(numpearls)
try:
cv.delete(zusammen)
except:
pass
#zusammen = str(numpearls)
sum = cv.create_text(60,420,text=zusammen,font=font1)
try:
cv.delete(cleanmessage)
except:
pass
if cleaning == TRUE:
xpos = (top+right)/2
ypos = bottom+30
text = cleantext
cleanmessage = cv.create_text(xpos,ypos,text=text,anchor='center',fill='red',font=font2)
return()
# ->>----THE-ABACUS-APPLICATION----<<-
root = Tk()
root.title("Abakus-Prototyp-27.01.04 - 03:00")
root['bg'] = 'steelblue3'
cv = Canvas(root,height=430,width=450,bd=4,relief=RAISED,bg='khaki2')
cv.pack()
usingIDLE = 1
#~~ Listendeklaration für die Anzahl verschobener Perlen
numlist = []
#~~ Zeichensätze
font1 = ('Helvetica', 15, 'bold')
font2 = ('Helvetica', 15, 'bold','underline')
cleantext = 'Bitte Bereinigen!!!'
r = 30 # Durchmesser der Perle
s = r+2 # Linker Anschlag für Perlen
gap = 6 # Vertikaler Zwischenraum
numcol = 10 # Anzahl Perlen pro Perlenreihe
numrows = 10 # Anzahl der Perlenreihen
dicke = 4 # Dicke der Reihenstange
top = r # Oberes Rahmenende
left = s # Linkes Rahmenende
right = left+(numcol+1)*r+8 #Rahmenende rechts
bottom = top+(numrows*r)+(numrows*gap) # Rahmenende unten
ypos = 0 # Vertikalposition der Reihenstange
yg = 0 # Hilfsvariable
#~~ Erzeugt Stangen
for rod in range(numrows):
ypos = s+(r/2+1)+yg+rod*r
stange = cv.create_line(left,
ypos,
right+2,
ypos,
fill='darkolivegreen4',
width=dicke)
yg += gap
#~~ Erzeug Textobjekte für die Anzahl verschobener Perlen
yg = 0
for num in range(numrows):
xpos = right+15
ypos = top+1+yg+r/2+num*r
textobj = cv.create_text(xpos,ypos,text=0,anchor='w',fill='blue',font=font1)
numlist.append(textobj)
yg += gap
#~~ Erzeugt Meldetext-Objekt für "Bereinigen"
xpos = (top+right)/2
ypos = bottom+30
text = ''
cleanmessage = cv.create_text(xpos,ypos,text=text,anchor='center',fill='red',font=font2)
#~~ Erzeugt Fenster, dass die dargestellte Zahl anzeigt
sum = cv.create_text(20,420,text=text)
#~~ Erzeugt Abakusrahmen
rectangle = cv.create_rectangle(left-2,
top-4,
right,bottom+4,
width= 8,
outline='darkgoldenrod4'
)
#~~ Erzeugt die Perlen
for x in range(numcol):
yg = 0
for y in range(numrows):
x0 = s+x*r
y0 = s+yg+y*r
x1 = s+(x+1)*r
y1 = s+yg+(y+1)*r
yg += gap
# Zeichne Perle
object = cv.create_oval(x0,y0,x1,y1,fill='green',outline='darkgreen')
# Event für die Rechtschiebung
cv.tag_bind(object,"<Button-1>",lambda e,Object=object:MoveRight(Object))
# Event für die Linksschiebung
cv.tag_bind(object,"<Button-3>",lambda e,Object=object:MoveLeft(Object))
quit = Button(root, text="Beenden", width=10, command=root.destroy)
quit.pack(side="bottom",pady=4)
if not usingIDLE:
root.mainloop()