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.

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)
ks2.bind("Return", lambda event: w.focus_set())


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()

_______________________________________________
Tkinter-discuss mailing list
Tkinter-discuss@python.org
https://mail.python.org/mailman/listinfo/tkinter-discuss

Reply via email to