How to get scene properties working without an initialize button?
Finally managed to solve this!

One problem with the method mentioned above is if the user changes scene with the addon enabled the UI breaks because the scene properties are no longer available.

Solution:

initialize your variables under the register function and register the classes within your script.

def register():
bpy.types.Scene.myprop1 = IntProperty(default = 0)
bpy.types.Scene.myprop2 = EnumProperty(items = [('ONE', 'ONE', 'NUMBER ONE'),('TWO', 'TWO', 'NUMBER TWO'),('THREE','THREE', 'NUMBER THREE')],name = "Choose Number", default='ONE')
bpy.utils.register_class(MyPanel)
bpy.utils.register_class(MyOperator)


Then whenever you want to reference or change the item in the script use:

bpy.context.scene.myprop1


Obviously replacing myprop1 with the name of the property. For example:

print(bpy.context.scene.myprop1, bpy.context.scene.myprop2)
&gt;&gt;&gt;0 ONE
bpy.context.scene.myprop1 += 1
print(bpy.context.scene.myprop1, bpy.context.scene.myprop2)
&gt;&gt;&gt;1 ONE


Last but not least to unregister the script:

bpy.utils.unregister_class(MyPanel)
bpy.utils.unregister_class(MyOperator)
del bpy.types.Scene.myprop1
del bpy.types.Scene.myprop2


Initially I was using:

bpy.context.scene['prop1']


from the code snippets but this doesn't work well so I recommend using scene.prop1 instead of scene['prop1']

Hope this helps!