Skript ausprobiert.
markiert.
Code: Alles auswählen
from Tkinter import *
import random
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
global sum #-> wuf: Hinzugefügt
# zusammen = ''
zusammen = 0 #-> wuf: Modifiziert
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)
zusammen += numpearls #-> wuf: Modifiziert
print zusammen
try: #-> wuf: try & except freigegeben
cv.delete(sum)
except:
pass
sum = cv.create_text(60,420,text = zusammen, font = font1) #-> wuf: freigegeben
# print "zusammen = ",zusammen
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()
def rechnung():
global falsch, richtig # falsch und richtig werden in dieser definition verwendet
z1 = random.randint(1.0,50.0)
z2 = random.randint(1.0,50.0)
op = random.randint(0,2) # die für die rechenoperation 3 zahlen weredn per zufall ausgesucht
oplist = ['+', '-', '*'] # liste, aus der das rechenzeichen gewählt wird; bei 0 is das rechenzeicen + usw.
global erg # das ergebnis wird global gemacht d.h ist für das ganze programm benutzbar
if op == 0: erg = z1 + z2 # berechnet erg
if op == 1: erg = z1 - z2 # berechnet erg
if op == 2: erg = z1 * z2 # berechnet erg
#if op == 3: erg = z1 / z2 # berechnet erg
ausgabe["text"] = (z1, oplist[op] , z2)# das rechenzeichen aus der liste verbindet bei der ausgabe die beiden zahlen
antwort["text"] = "" # das antwort label (das richtig oder falsch anzeigt) wird geleert
#reset() ### WICHTIG:HIER SOLLTE ALLES VON ANFANG AN STARTEN!!!WIRKLICHES RESET,NICHT STATISTIK
def vergleich():
global falsch, richtig # falsch und richtig werden in dieser definition verwendet
eing = zusammen # die eingabe vom benutzer wird einer variablen zugeordnet
if int(zusammen) == erg : # wenn die eingabe gleich dem ergebniss ist
antwort["text"]= "richtig" # dann wird im antwort label "richtig" ausgegeben
#richtig = richtig + 1 # in dem zähler wird zu richtig eine 1 addiert
#eingabe_zeile.delete(0, END) # dann wird die eingabe des users gelöscht
else: # andernfalls
antwort["text"]= "falsch,", erg # im antwort label erscheint "falsch" und richtiges ergebnis
#falsch = falsch + 1 # es wird eine 1 zu fasch addiert
#eingabe_zeile.delete(0, END)#dann wird die eingabe des users gelöscht
#statistik["text"]= "Richtig=" ,str(richtig), "Falsch=",str(falsch) # dann wird die statistik aktualiesiert
##def reset(): # der reset button soll den zähler bei beiden zahlen auf o stellen
## global falsch, richtig # falsch und richtig werden in dieser definition verwendet
## richtig = 0 # richtig wird auf 0 zurückgestellt
## falsch = 0 # falsch wird auf 0 zurückgesttellt
## statistik["text"]= "Richtig=" ,str (richtig), "Falsch=",str(falsch)# die statistik wird aktualisiert
# ->>----THE-ABACUS-APPLICATION----<<-
root = Tk()
root.title("Abakus-Prototyp-27.01.04 - 03:00")
root['bg'] = 'steelblue3'
cv = Canvas(root,height=500,width=550,bd=4,relief=RAISED,bg='khaki2') #-> wuf: height auf 500
cv.pack()
usingIDLE = 0
#~~ Listendeklaration für die Anzahl verschobener Perlen
numlist = []
#~~ Zeichensätze
font1 = ('Helvetica', 15, 'bold')
font2 = ('Helvetica', 20, '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 #-> wuf: auf 10 erhöht
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(60,420,text = text) #-> wuf: freigegeben
#~~ 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))
# rechnung button -> stellt neue Aufgabe zusammen
rechnung_button = Button(root,text="Neue Aufgabe",width=12,command=rechnung)
rechnung_button.pack(side="left")
# ausgabe label
ausgabe = Label(root,width=12,text="////////////")
ausgabe.pack(side="left")
# pruef button -> wertet ergebnis aus
pruef_button = Button(root,text="Nachprüfen", command = vergleich,width = 12)
pruef_button.pack(side="left")
# antwort label -> zeigt richtig oder falsch an
antwort= Label(root,width=12,text="richtig / falsch")
antwort.pack(side="left")
quit = Button(root, text="Beenden", width=10, command=root.destroy)
quit.pack(side="right",pady=4)
if not usingIDLE:
root.mainloop()