Grandediw commited on
Commit
10d6aa1
·
verified ·
1 Parent(s): 3bd6ff9

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +76 -28
app.py CHANGED
@@ -80,44 +80,92 @@ def predict_outcome(opponent_deck):
80
  model = load_model(MODEL_PATH)
81
 
82
  # Create Gradio Interface
83
- with gr.Blocks() as interface:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
84
  gr.Markdown("## Clash Royale Prediction")
85
  gr.Markdown("Select 8 cards from the opponent's deck to predict the probability of winning!")
86
 
87
- selected_deck = gr.CheckboxGroup(
88
- label="Select 8 Cards",
89
- choices=list(valid_card_images.keys()),
90
- info="You must select exactly 8 cards.",
91
- interactive=True,
92
- )
93
-
94
- with gr.Row():
 
 
 
 
 
 
 
 
95
  for card, url in valid_card_images.items():
96
- with gr.Column():
97
- gr.Image(value=url, label=card, interactive=False, elem_id=f"image-{card}")
98
- gr.Checkbox(label=card, value=False, elem_id=f"checkbox-{card}").change(
99
- lambda name, state: name if state else None,
100
- inputs=[gr.Textbox(value=card), selected_deck],
101
- outputs=[selected_deck],
 
102
  )
103
 
104
- result = gr.Textbox(label="Prediction Result:", interactive=False)
 
 
 
 
 
 
 
 
 
 
 
105
 
106
  def validate_and_predict(deck):
107
  if len(deck) != 8:
108
- return "Error: Select exactly 8 cards."
109
  return predict_outcome(deck)
110
 
111
- predict_button = gr.Button("Make Prediction")
112
- predict_button.click(validate_and_predict, inputs=[selected_deck], outputs=[result])
113
-
114
- # CSS per dimensioni immagini e layout
115
- interface.css = """
116
- img {
117
- width: 70px !important;
118
- height: 70px !important;
119
- margin-bottom: 5px;
120
- }
121
- """
122
 
123
  interface.launch()
 
80
  model = load_model(MODEL_PATH)
81
 
82
  # Create Gradio Interface
83
+ with gr.Blocks(css="""
84
+ .card-grid {
85
+ display: grid;
86
+ grid-template-columns: repeat(auto-fill, minmax(100px, 1fr));
87
+ gap: 10px;
88
+ padding: 10px;
89
+ }
90
+ .card-container {
91
+ display: flex;
92
+ flex-direction: column;
93
+ align-items: center;
94
+ padding: 5px;
95
+ border: 1px solid #ddd;
96
+ border-radius: 8px;
97
+ transition: all 0.3s ease;
98
+ }
99
+ .card-container:hover {
100
+ transform: scale(1.05);
101
+ box-shadow: 0 4px 8px rgba(0,0,0,0.1);
102
+ }
103
+ .card-container img {
104
+ width: 80px;
105
+ height: 80px;
106
+ object-fit: contain;
107
+ }
108
+ .card-container.selected {
109
+ background-color: #e3f2fd;
110
+ border-color: #2196f3;
111
+ }
112
+ .card-label {
113
+ font-size: 12px;
114
+ text-align: center;
115
+ margin-top: 5px;
116
+ }
117
+ """) as interface:
118
  gr.Markdown("## Clash Royale Prediction")
119
  gr.Markdown("Select 8 cards from the opponent's deck to predict the probability of winning!")
120
 
121
+ # State for tracking selected cards
122
+ selected_deck = gr.State([])
123
+
124
+ # Display for currently selected cards
125
+ selected_cards_display = gr.Markdown("Selected cards: 0/8")
126
+
127
+ def toggle_card(card_name, current_deck):
128
+ if card_name in current_deck:
129
+ current_deck.remove(card_name)
130
+ else:
131
+ if len(current_deck) < 8:
132
+ current_deck.append(card_name)
133
+ return current_deck, f"Selected cards: {len(current_deck)}/8"
134
+
135
+ # Create card grid
136
+ with gr.Box(elem_classes="card-grid"):
137
  for card, url in valid_card_images.items():
138
+ with gr.Box(elem_classes="card-container"):
139
+ btn = gr.Button(image=url, label=card, scale=0)
140
+ gr.Markdown(card, elem_classes="card-label")
141
+ btn.click(
142
+ toggle_card,
143
+ inputs=[gr.Textbox(value=card, visible=False), selected_deck],
144
+ outputs=[selected_deck, selected_cards_display]
145
  )
146
 
147
+ with gr.Row():
148
+ result = gr.Textbox(label="Prediction Result:", interactive=False)
149
+ clear_btn = gr.Button("Clear Selection")
150
+ predict_btn = gr.Button("Make Prediction", variant="primary")
151
+
152
+ def clear_selection():
153
+ return [], "Selected cards: 0/8", ""
154
+
155
+ clear_btn.click(
156
+ clear_selection,
157
+ outputs=[selected_deck, selected_cards_display, result]
158
+ )
159
 
160
  def validate_and_predict(deck):
161
  if len(deck) != 8:
162
+ return "Error: Please select exactly 8 cards"
163
  return predict_outcome(deck)
164
 
165
+ predict_btn.click(
166
+ validate_and_predict,
167
+ inputs=[selected_deck],
168
+ outputs=[result]
169
+ )
 
 
 
 
 
 
170
 
171
  interface.launch()