I see, it may be a designed that way for drag and drop reasons.
If you want to circumvent that behavior I have two suggestions. The first is a bit hacky and may create other undesired effects, so it may need other flags. It would be to code a mouse button release event.
func _on_Tile_input_event( ev ):
if(ev.type==InputEvent.MOUSE_BUTTON and ev.pressed):
if (ev.button_index==BUTTON_LEFT):
if(filled):
get_node("Sprite").set_texture(Blank)
filled = false
else:
get_node("Sprite").set_texture(Filled)
filled = true
# Release button
var event = InputEvent()
event.type = InputEvent.MOUSE_BUTTON
event.button_index=BUTTON_LEFT
event.pressed = false
get_tree().input_event(event)
The second solution, which may be more robust, but will take a little extra effort to implement, is to create your own mouse over detection. You would poll the mouse coordinates, and use rectangle collision detection to know if the cursor is in bounds of any given tile.
Many nodes can return their rectangle as Rect2, and inside that is an collision method where you can send the mouse coordinates as a Vector2.
http://docs.godotengine.org/en/stable/classes/class_rect2.html#class-rect2-has-point
There might be some other option for input handling that escapes me, but it may be because it's obscure.