To solve this optimization problem, we first need to define the decision variables and the objective function. Let's denote the number of Package 1 sold as `x` and the number of Package 2 sold as `y`. The objective is to maximize profit, which can be calculated as $10x + 12y$ since each Package 1 brings a profit of $10 and each Package 2 brings a profit of $12.

Next, we need to consider the constraints based on the available souvenirs and snacks. Each Package 1 contains 5 souvenirs and 10 snacks, while each Package 2 contains 4 souvenirs and 15 snacks. The museum has 1000 souvenirs and 1400 snacks. Therefore, the total number of souvenirs used in both packages should not exceed 1000, and the total number of snacks used should not exceed 1400. This gives us two constraints:

1. For souvenirs: $5x + 4y \leq 1000$
2. For snacks: $10x + 15y \leq 1400$

Additionally, since we cannot sell a negative number of packages, both `x` and `y` should be non-negative.

Now, let's translate this problem into Gurobi code:

```python
from gurobipy import *

# Create a model
m = Model("Museum_Gift_Shop")

# Define decision variables
x = m.addVar(lb=0, vtype=GRB.INTEGER, name="Package1")
y = m.addVar(lb=0, vtype=GRB.INTEGER, name="Package2")

# Set the objective function: Maximize profit
m.setObjective(10*x + 12*y, GRB.MAXIMIZE)

# Add constraints
m.addConstr(5*x + 4*y <= 1000, "SouvenirConstraint")
m.addConstr(10*x + 15*y <= 1400, "SnackConstraint")

# Optimize the model
m.optimize()

# Print results
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Number of Package 1: {x.x}")
    print(f"Number of Package 2: {y.x}")
    print(f"Maximum Profit: ${10*x.x + 12*y.x}")
else:
    print("No optimal solution found")
```