blender python remove button in UI
One way is via a UILayout.prop_search 

In example below the string property scene.target_object is set to the name of one of the objects in the scene.  Also note the "X" remove button once set.

import bpy
from bpy.props import StringProperty

class HelloWorldPanel(bpy.types.Panel):
    """Creates a Panel in the Object properties window"""
    bl_label = "Hello World Panel"
    bl_idname = "OBJECT_PT_hello"
    bl_space_type = 'PROPERTIES'
    bl_region_type = 'WINDOW'
    bl_context = "scene"

    def draw(self, context):
        layout = self.layout

        scene = context.scene

        row = layout.row()
        row.prop_search(scene, "target_object", scene, "objects")
        print(scene.target_object)

def register():
    bpy.types.Scene.target_object = StringProperty()
    bpy.utils.register_class(HelloWorldPanel)

def unregister():
    bpy.utils.unregister_class(HelloWorldPanel)

if __name__ == "__main__":
    register()


On the selecting objects by a criteria, you can also use a user defined collection property as the search data.  For instance in my sound_drivers addon scene.driver_objects is defined as a PointerProperty, scene.driver_objects.armatures is a CollectionProperty.  The collection is populated by all the armatures (by name) with drivers in the scene.

    row.prop_search(scene, "target_object",
                    scene.driver_objects, "armatures")