I apologise if I have come to the wrong place here, but 12hrs searching, plus experimenting, on the WWW for advice on it has not yielded any successful advice to resolve the issue.
I am am having trouble binding an Entry widget to <Return> Here is the snippet (butCol is a Frame widget to put buttons,labels and text entry down LHS) KS1=StringVar() KS1.set("Key is ??") butCol.ks1 =Label(butCol,textvariable=KS1).grid(column=0,row=18,sticky=(N,W)) myKey = [0,2,4,5,7,9,11] #Begin in the key of C KS2 =StringVar() KS2.set("C") butCol.ks2 =Entry(butCol,width=20,textvariable=KS2).grid(column=0,row=19,sticky=(N,W)) The above lines all render correctly, but will not trigger off "entry" of data at all on <Return> Adding the following line just crashes. butCol.ks2.bind("<Return>",chooseKey) I downloaded the Python 3 package from the recommended site last week to begin this project (it was previously working OK in Skulptor, but I was not prepared to develop it any further in that environment, though it was an excellent starting environment). So I believe the Python language installed is up todate. I have not previously installed Python so it should be "clean". If you could give any direct advice I would be very grateful or if you can direct me to your best "forum" site maybe I could use that. One overall observation that has frustrated me is how toi search for information that relates to Python3 and the latest tkinter modules. I kept finding old python or old Tkinter or combinations of both. Wrorking my way through this was very time consuming and rarely productive. Is there any advice on how to get the "latest" information off the WWW? Cheers, Rob Ward PS In my state of eternal optimism I have attached the whole file :-) PPS I have done some OOP in the past but not keen to jump in at the moment.
from tkinter import * from tkinter import ttk def chooseKey(event): global myKey global key ans = KS2.get().lower keyS="??,E,A,D,G,C,F,Bb,Eb,Ab" if (ans =="e"): #Key of E, 4 Sharps F,C,G,D # C D E F G A B myKey = [1,3,4,6,8,9,11] keyS="Key: E <F# C# G# D#>" if (ans =="a"): #Key of A, 3 Sharps F,C,G myKey = [1,2,4,6,8,9,11] keyS="Key: A <F# C# G#>" if (ans =="d"): #key of D, 2 Sharps F,C myKey = [1,2,4,6,7,9,11] keyS="Key: D <F# C#>" if (ans =="g"): #key of G, 1 Sharp F myKey = [0,2,4,5,7,9,11] keyS="Key: G <F#>" if (ans =="c"): #Key of C, root scale myKey = [0,2,4,5,7,9,11] keyS="Key: C" if (ans =="f"): #Key of F, 1 flat B myKey = [0,2,4,5,7,9,10] keyS="Key: F <Bb>" if (ans =="bb"): #Key of Bb, 2 Flats B,E myKey = [0,2,3,5,7,9,10] keyS="Key: Bb <Bb Eb>" if (ans =="ab"): #Key of Eb, 3 Flats B,E,A myKey = [0,2,3,5,7,8,10] keyS="Key: Eb <Bb Eb Ab>" if (ans =="eb"): #Key of Ab, 4 Flats B,E,A,D myKey = [0,1,3,5,7,8,10] keyS="Key: Ab <Bb Eb Ab Db>" loadMidi() KS1.set(keyS) #Durations of standard notes def semiquaver(): print("semiquaver") global dur dur = 6 def quaver(): print("quaver") global dur dur = 12 def crochet(): print("crochet") global dur dur = 24 def semibreve(): print("semibreve") global dur dur = 48 def breve(): print("breve") global dur dur = 96 def loadMidi(): global myMidi global myKey del myMidi[:] for notes in range(24,106,12): #C1 to C8 in steps of 12 myMidi.append(notes+myKey[0]) #C skip C#,Db myMidi.append(notes+myKey[1]) #D skip Eb,D# myMidi.append(notes+myKey[2]) #E half tone myMidi.append(notes+myKey[3]) #F skip F#, Gb myMidi.append(notes+myKey[4]) #G skip G#, Ab myMidi.append(notes+myKey[5]) #A skip Bb myMidi.append(notes+myKey[6]) #B half tone #print 'Init loop',myMidi #This is the handler for mouse click events. Note that it #must take one parameter, a tuple of the position of the #mouse click. def canvas_click(event): #print ('Mouse x=', event.x," - ",event.y) global accidental global aNote global dotted global myMidi aNote = [int((event.x+5)/10)*10,int((event.y+5)/10)*10] #Quantise position, tuplet for X,Y of current note Y=int(((785-event.y)/10)) #print ('Y-Coord ',Y) #print ('Midi = ',myMidi[Y]) dummy = '"note"'+":["+str(int((aNote[0]-200)/10))+","+str(myMidi[Y]+accidental)+","+str(int(dur*dotted))+"]," NL1.set(dummy) #print (dummy) tune.append(dummy)#Main data list of note information #Push the Note Grahpic onto a list for redraw and also countback purposes for erasing notes and bars noteHist.append(([aNote[0],aNote[1]+10],[aNote[0],aNote[1]-10],[aNote[0]+10*dur*dotted,aNote[1]])) accidental=0 #reset accidentals sharpS="Sharpen" natS="Natural True" flatS="Flatten" dotted = 1.0 #reset the dotted effect dotS="Dotted False" draw_note(canvas) def draw_note(canvas): #Draw the note graphic canvas.delete("stem","oval1","oval2","flag1","flag2") # remove all items global dur global aNote #Draw history of notes entered for myNotes in range(0,len(noteHist)): #Nos of subdivisions in a bar canvas.create_polygon([(noteHist[myNotes][0]), (noteHist[myNotes][1]), (noteHist[myNotes][2])], width=2, fill="white", tag="noteHist") #draw where the current note should be print("duration = ",dur," aNote[",aNote,"]") canvas.create_oval([aNote[0]-10,aNote[1]-8,aNote[0]+10,aNote[1]+8], width=3,tag="oval1",outline="black")#Oval filled in white, begin as a breve if (dur <96): #Draw a stem in black, all non-breves have a stem canvas.create_line((aNote[0]+10,aNote[1]), (aNote[0]+10,aNote[1]-60), width=3, fill="black",tag="stem") if (dur <48): #All notes less than sem-breve are filled with black canvas.create_oval([aNote[0]-10,aNote[1]-8,aNote[0]+10,aNote[1]+8],width=0, fill="black",tag="oval2")#Oval empty if (dur <24): #add one flag for a Quaver canvas.create_line((aNote[0]+10,aNote[1]-60), (aNote[0]+30,aNote[1]-45), width=3, fill="black", tag="flag1") if (dur<12): #add second line for a semi quaver canvas.create_line((aNote[0]+10,aNote[1]-45), (aNote[0]+30,aNote[1]-30), width=3, fill="black",tag="flag2") def draw_handler(canvas): #Draw the titles on the canvas canvas.create_text((20, 400),text="Treble Clef", anchor="nw") canvas.create_text( (20, 520),text="Bass Clef",anchor="nw") canvas.create_text( (80, 50),text="Scheduler+Midi",anchor="nw") #draw the timing lines for lines in range(200,1180,20): #Nos of subdivisions in a bar lwidth = 1 if (lines+40)%60 == 0: lwidth =2 if (lines+40)%240 == 0: lwidth =3 canvas.create_line((lines,280),(lines,680),width=lwidth,fill="yellow") #above treble cleff canvas.create_line((200, 300), (1160, 300), width=1,fill="blue") canvas.create_line((200, 320), (1160, 320), width=1, fill="blue") canvas.create_line((200, 340), (1160, 340), width=1, fill="blue") canvas.create_line((200, 360), (1160, 360), width=1, fill="blue") canvas.create_line((200, 380), (1160, 380), width=1, fill="blue") # Treble Clef Lines canvas.create_line((100, 400), (1180, 400), width=3, fill="black") canvas.create_line((100, 420), (1180, 420), width=3, fill="black") canvas.create_line((100, 440), (1180, 440), width=3, fill="black") canvas.create_line((100, 460), (1180, 460), width=3, fill="black") canvas.create_line((100, 480), (1180, 480), width=3, fill="black") #middle "c" canvas.create_line((200, 500), (1160, 500), width=1, fill="blue") # Bass Clef Lines canvas.create_line((100, 520), (1180, 520), width=3, fill="black") canvas.create_line((100, 540), (1180, 540), width=3, fill="black") canvas.create_line((100, 560), (1180, 560), width=3, fill="black") canvas.create_line((100, 580), (1180, 580), width=3, fill="black") canvas.create_line((100, 600), (1180, 600), width=3, fill="black") #below the Bass Cleff canvas.create_line((200, 620), (1160, 620), width=1, fill="blue") canvas.create_line((200, 640), (1160, 640), width=1, fill="blue") canvas.create_line((200, 660), (1160, 660), width=1, fill="blue") #canvas.create_image(self.image, image_center, image_size, pos, image_size) #84 across by 232 Tcleff.png tcleff = PhotoImage(file="Tcleff.gif") canvas.create_image(110,390,image=tcleff, anchor="nw") #80 across by 97 Bcleff.png bcleff = PhotoImage(file="Bcleff.gif") canvas.create_image(110,523,image=bcleff,anchor="nw" ) draw_note(canvas) #core Bar editting def clearBar(): global bar BN1.set("Bar Cleared:"+str(bar)) if(len(noteHist)>0): for myNotes in range(0,len(noteHist)): noteHist.pop(len(noteHist)-1) tune.pop(len(tune)-1) def incBar(): global bar global noteHist bar=bar+1 #print ('"bar":',str(bar)) tune.append('"bars"'+":"+str(bar)+",") noteHist=[] #clear the graphics for the next bar BN1.set('Bar Selected:'+str(bar)) def decBar(): global bar if (bar>1): #No negative bars please!!! bar=bar-1 #print('"bar":',str(bar)) BN1.set('Bar Selected:'+str(bar)) def erase(): #Erase the last entered note if (len(noteHist)>0):#only if the current bar has any history (left?) tune.pop(len(tune)-1)#removes notes off the main tune list noteHist.pop(len(noteHist)-1)#removes notes from previous history of current bar #Control Accidentals def sharpen(): global accidental accidental = 1 AS1.set("Sharpen True") AS2.set("Natural") AS3.set("Flatten") def natural(): global accidental accidental=0 AS1.set("Sharpen") AS2.set("Natural True") AS3.set("Flatten") def flatten(): global accidental accidental = -1 AS1.set("Sharpen") AS2.set("Natural") AS3.set("Flatten True") def dot(): global dotted if (dotted==1.5): dotted = 1.0 DS1.set("Dotted False") else: dotted = 1.5 DS1.set("Dotted True") #Other functions def chooseInstrument(temp): global instrument IN1.set("Instrument= "+IN2.get()) instrument=int(IN2.get()) def save(): midiWhole.append('"midi":'+str(instrument)+',') midiWhole.extend(tune) for myData in range(0,len(midiWhole)): #Nos of subdivisions in a bar print (midiWhole[myData]) #***************************************** #******* START OF MAIN PROGRAM ******* #***************************************** frame = Tk() #Establish main Frame graphic = Frame(frame) #Master sub-Frame graphic.grid()#Establish the Layout manager butCol = Frame(graphic,width=120,height=750)# A sub-sub-Frame to hold all the buttons down the LHS canvas = Canvas(graphic,width=1200,height=750,bg='gray')#sub-sub-frame should allow us to draw inside the frame 'graphic'? #How to organise widgets within the grid butCol.grid(column=1, row=1) #Down LHS butCol.grid(sticky=(N, E, W), pady=5, padx=5 ) canvas.grid(column=2, row=1, sticky=(N, W, E, S)) #Rest of space the RHS print("Layout widgets and plan established") #Establish major lists and variables tune = [] noteHist = [] midiWhole=[] #Note presets dur=0 #Length of a note barNosS = "1" barNos=str(barNosS) myKey =[] myMidi =[] aNote = [200,500] #Middle C to begin with noteFill = 'black' bar = 1 #just to kick the bar nos off :-) dur =24 #default Crochet note length accidental = 0 dotted = 1.0 #the multiplier for 'dot'ing 1 = off, 1.5 = on sharpS="Sharpen" natS="Natural True" flatS="Flatten" dotted = 1.0 #reset the dotted effect dotS="Dotted False" print ("Globals established") #draw the teble and bass cleff stave graphics on the canvas draw_handler(canvas) #define/draw the GUI elements to control editting canvas.bind('<Button-1>', canvas_click) #frame.bind('<Return>', frame.search) nameLbl =Label (butCol,text="Scheduler+Midi V1.7").grid(column=0, row=0, sticky=(N,W)) label1 =Label (butCol,text="Note Selection:??").grid(column=0, row=1, sticky=(N,W)) semiQaver =Button(butCol,text="SemiQuaver 6", command=semiquaver).grid(column=0, row=2, sticky=(N,W)) Quaver =Button(butCol,text="Quaver 12", command=quaver).grid(column=0, row=3, sticky=(N,W)) Crochet =Button(butCol,text="Crochet 24", command=crochet).grid(column=0,row=4, sticky=(N,W)) Semibreve =Button(butCol,text="SemiBreve 48", command=semibreve).grid(column=0, row=5, sticky=(N,W)) Breve =Button(butCol,text="Breve 96", command=breve).grid(column=0, row=6, sticky=(N,W)) DS1 = StringVar()#Creates a special tkinter variable DS1.set("Dotted False") Dot =Button(butCol,command=dot,textvariable=DS1).grid(column=0,row=7,sticky=(N,W)) Erase =Button(butCol,text="Erase last Note", command=erase).grid(column=0, row=8, sticky=(N,W)) label2 =Label(butCol,text="Accidentals: ").grid(column=0, row=9, sticky=(N,W)) AS1 = StringVar() AS1.set("Sharpen") as1 =Button(butCol, command=sharpen,textvariable=AS1).grid(column=0, row=10, sticky=(N,W)) AS2 = StringVar() AS2.set("Natural") as2 =Button(butCol,text="Natural", command=natural,textvariable=AS2).grid(column=0, row=12, sticky=(N,W)) AS3 = StringVar() AS3.set("Flatten") as3 =Button(butCol,text="Flatten", command=flatten,textvariable=AS3).grid(column=0, row=13, sticky=(N,W)) BN1 = StringVar() BN1.set("Bar Selected:"+str(barNos)) BarNos1 =Label(butCol,textvariable= BN1).grid(column=0,row=14,sticky=(N,W)) Incbar =Button(butCol,text="IncBar & Clear", command=incBar).grid(column=0,row=15,sticky=(N,W)) Decbar =Button(butCol,text="Dec Bar", command=decBar).grid(column=0,row=16,sticky=(N,W)) Clearbar =Button(butCol,text="Clear Bar", command=clearBar).grid(column=0,row=17,sticky=(N,W)) KS1=StringVar() KS1.set("Key is ??") butCol.ks1 =Label(butCol,textvariable=KS1).grid(column=0,row=18,sticky=(N,W)) myKey = [0,2,4,5,7,9,11] #Begin in the key of C KS2 =StringVar() KS2.set("C") butCol.ks2 =Entry(butCol,width=20,textvariable=KS2).grid(column=0,row=19,sticky=(N,W)) #butCol.ks2.bind("<Return>",chooseKey) IN1 =StringVar() IN1.set("Instrument is ??") in1 =Label(butCol,textvariable=IN1).grid(column=0,row=20,sticky=(N,W)) IN2 =StringVar() in2 =Entry(butCol,textvariable=IN2).grid(column=0,row=21,sticky=(N,W)) #in2.bind('<Return>',butCol.search) Save =Button(butCol,text="Dump to Debug", command=save).grid(column=0,row=22,sticky=(N,W)) NL1 =StringVar() NL1.set("Note entered:") nl1 =Label (butCol,textvariable=NL1).grid(column=0,row=23,sticky=(N,W)) print("Widgets established") key='C' instrumentS = "1" #Variable to interact with the entry widget instrument = int(instrumentS) #Establish midi note lookup list for a particular key #print('myKey = ',myKey) loadMidi() #print("myMidi = ",myMidi) #print("aNote = ",aNote) print("Begin Event driven GUI") frame.mainloop()
_______________________________________________ Python-Dev mailing list Python-Dev@python.org https://mail.python.org/mailman/listinfo/python-dev Unsubscribe: https://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com