throaway2854 commited on
Commit
00039a6
·
verified ·
1 Parent(s): 7350384

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +75 -31
app.py CHANGED
@@ -108,19 +108,27 @@ def load_dataset_from_zip(zip_file_path):
108
  print(f"Error loading dataset: {e}")
109
  return None, []
110
 
111
- def display_dataset_html(dataset):
112
  if dataset:
113
- html_content = ""
114
- for idx, entry in enumerate(dataset):
 
 
 
 
 
 
 
115
  image_data = entry['image']
116
  prompt = entry['prompt']
117
  html_content += f"""
118
- <div style="display: flex; align-items: center; margin-bottom: 10px;">
119
- <div style="width: 50px;">{idx}</div>
120
- <img src="{image_data}" alt="Image {idx}" style="max-height: 100px; margin-right: 10px;"/>
121
- <div>{prompt}</div>
122
  </div>
123
  """
 
124
  return html_content
125
  else:
126
  return "<div>No entries in dataset.</div>"
@@ -129,9 +137,9 @@ with gr.Blocks() as demo:
129
  gr.Markdown("<h1 style='text-align: center; margin-bottom: 20px;'>Dataset Builder</h1>")
130
  datasets = gr.State({})
131
  current_dataset_name = gr.State("")
 
132
  dataset_selector = gr.Dropdown(label="Select Dataset", interactive=True)
133
  entry_selector = gr.Dropdown(label="Select Entry to Edit/Delete")
134
- dataset_html = gr.HTML()
135
  message_box = gr.Textbox(interactive=False, label="Message")
136
 
137
  with gr.Tab("Create / Upload Dataset"):
@@ -179,17 +187,17 @@ with gr.Blocks() as demo:
179
  def select_dataset(dataset_name, datasets):
180
  if dataset_name in datasets:
181
  dataset = datasets[dataset_name]
182
- html_content = display_dataset_html(dataset)
183
  # Update entry_selector options
184
  entry_options = [f"{idx}: {entry['prompt'][:30]}" for idx, entry in enumerate(dataset)]
185
- return dataset_name, gr.update(value=html_content), gr.update(choices=entry_options), ""
186
  else:
187
- return "", gr.update(value="<div>Select a dataset.</div>"), gr.update(choices=[]), ""
188
 
189
  dataset_selector.change(
190
  select_dataset,
191
  inputs=[dataset_selector, datasets],
192
- outputs=[current_dataset_name, dataset_html, entry_selector, message_box]
193
  )
194
 
195
  with gr.Tab("Add Entry"):
@@ -200,9 +208,9 @@ with gr.Blocks() as demo:
200
 
201
  def add_entry(image_data, prompt, current_dataset_name, datasets):
202
  if not current_dataset_name:
203
- return datasets, gr.update(), gr.update(), "No dataset selected."
204
  if image_data is None or not prompt:
205
- return datasets, gr.update(), gr.update(), "Please provide both an image and a prompt."
206
  # Convert image_data to base64
207
  image = Image.fromarray(image_data.astype('uint8'))
208
  buffered = BytesIO()
@@ -211,15 +219,17 @@ with gr.Blocks() as demo:
211
  img_data = f"data:image/png;base64,{img_str}"
212
  datasets[current_dataset_name].append({'image': img_data, 'prompt': prompt})
213
  dataset = datasets[current_dataset_name]
214
- html_content = display_dataset_html(dataset)
 
 
215
  # Update entry_selector options
216
  entry_options = [f"{idx}: {entry['prompt'][:30]}" for idx, entry in enumerate(dataset)]
217
- return datasets, gr.update(value=html_content), gr.update(choices=entry_options), f"Entry added to dataset '{current_dataset_name}'."
218
 
219
  add_button.click(
220
  add_entry,
221
  inputs=[image_input, prompt_input, current_dataset_name, datasets],
222
- outputs=[datasets, dataset_html, entry_selector, message_box]
223
  )
224
 
225
  with gr.Tab("Edit / Delete Entry"):
@@ -250,42 +260,42 @@ with gr.Blocks() as demo:
250
  outputs=[selected_image, selected_prompt]
251
  )
252
 
253
- def edit_entry(entry_option, new_prompt, current_dataset_name, datasets):
254
  if not current_dataset_name:
255
- return datasets, gr.update(), gr.update(), gr.update(), "No dataset selected."
256
  if not entry_option or not new_prompt.strip():
257
- return datasets, gr.update(), gr.update(), gr.update(), "Please select an entry and provide a new prompt."
258
  index = int(entry_option.split(":")[0])
259
  datasets[current_dataset_name][index]['prompt'] = new_prompt
260
  dataset = datasets[current_dataset_name]
261
- html_content = display_dataset_html(dataset)
262
  # Update entry_selector options
263
  entry_options = [f"{idx}: {entry['prompt'][:30]}" for idx, entry in enumerate(dataset)]
264
- return datasets, gr.update(value=html_content), gr.update(choices=entry_options), gr.update(value=""), f"Entry {index} updated."
265
 
266
  edit_button.click(
267
  edit_entry,
268
- inputs=[entry_selector, new_prompt_input, current_dataset_name, datasets],
269
- outputs=[datasets, dataset_html, entry_selector, new_prompt_input, message_box]
270
  )
271
 
272
- def delete_entry(entry_option, current_dataset_name, datasets):
273
  if not current_dataset_name:
274
- return datasets, gr.update(), gr.update(), gr.update(), gr.update(), "No dataset selected."
275
  if not entry_option:
276
- return datasets, gr.update(), gr.update(), gr.update(), gr.update(), "Please select an entry to delete."
277
  index = int(entry_option.split(":")[0])
278
  del datasets[current_dataset_name][index]
279
  dataset = datasets[current_dataset_name]
280
- html_content = display_dataset_html(dataset)
281
  # Update entry_selector options
282
  entry_options = [f"{idx}: {entry['prompt'][:30]}" for idx, entry in enumerate(dataset)]
283
- return datasets, gr.update(value=html_content), gr.update(choices=entry_options), gr.update(value=None), gr.update(value=""), f"Entry {index} deleted."
284
 
285
  delete_button.click(
286
  delete_entry,
287
- inputs=[entry_selector, current_dataset_name, datasets],
288
- outputs=[datasets, dataset_html, entry_selector, selected_image, selected_prompt, message_box]
289
  )
290
 
291
  with gr.Tab("Download Dataset"):
@@ -310,6 +320,40 @@ with gr.Blocks() as demo:
310
  outputs=[download_output, message_box]
311
  )
312
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
313
  # Initialize dataset_selector and entry_selector
314
  def initialize_components(datasets):
315
  return gr.update(choices=list(datasets.keys())), gr.update(choices=[])
 
108
  print(f"Error loading dataset: {e}")
109
  return None, []
110
 
111
+ def display_dataset_html(dataset, page_number=0, items_per_page=5):
112
  if dataset:
113
+ start_idx = page_number * items_per_page
114
+ end_idx = start_idx + items_per_page
115
+ dataset_slice = dataset[start_idx:end_idx]
116
+ total_pages = (len(dataset) - 1) // items_per_page + 1
117
+ html_content = '''
118
+ <div style="display: flex; overflow-x: auto; padding: 10px; border: 1px solid #ccc;">
119
+ '''
120
+ for idx_offset, entry in enumerate(dataset_slice):
121
+ idx = start_idx + idx_offset
122
  image_data = entry['image']
123
  prompt = entry['prompt']
124
  html_content += f"""
125
+ <div style="display: flex; flex-direction: column; align-items: center; margin-right: 20px;">
126
+ <div style="margin-bottom: 5px;">{idx}</div>
127
+ <img src="{image_data}" alt="Image {idx}" style="max-height: 150px;"/>
128
+ <div style="max-width: 150px; word-wrap: break-word; text-align: center;">{prompt}</div>
129
  </div>
130
  """
131
+ html_content += '</div>'
132
  return html_content
133
  else:
134
  return "<div>No entries in dataset.</div>"
 
137
  gr.Markdown("<h1 style='text-align: center; margin-bottom: 20px;'>Dataset Builder</h1>")
138
  datasets = gr.State({})
139
  current_dataset_name = gr.State("")
140
+ current_page_number = gr.State(0)
141
  dataset_selector = gr.Dropdown(label="Select Dataset", interactive=True)
142
  entry_selector = gr.Dropdown(label="Select Entry to Edit/Delete")
 
143
  message_box = gr.Textbox(interactive=False, label="Message")
144
 
145
  with gr.Tab("Create / Upload Dataset"):
 
187
  def select_dataset(dataset_name, datasets):
188
  if dataset_name in datasets:
189
  dataset = datasets[dataset_name]
190
+ html_content = display_dataset_html(dataset, page_number=0)
191
  # Update entry_selector options
192
  entry_options = [f"{idx}: {entry['prompt'][:30]}" for idx, entry in enumerate(dataset)]
193
+ return dataset_name, 0, gr.update(value=html_content), gr.update(choices=entry_options), ""
194
  else:
195
+ return "", 0, gr.update(value="<div>Select a dataset.</div>"), gr.update(choices=[]), ""
196
 
197
  dataset_selector.change(
198
  select_dataset,
199
  inputs=[dataset_selector, datasets],
200
+ outputs=[current_dataset_name, current_page_number, gr.HTML(), entry_selector, message_box]
201
  )
202
 
203
  with gr.Tab("Add Entry"):
 
208
 
209
  def add_entry(image_data, prompt, current_dataset_name, datasets):
210
  if not current_dataset_name:
211
+ return datasets, gr.update(), gr.update(), gr.update(), "No dataset selected."
212
  if image_data is None or not prompt:
213
+ return datasets, gr.update(), gr.update(), gr.update(), "Please provide both an image and a prompt."
214
  # Convert image_data to base64
215
  image = Image.fromarray(image_data.astype('uint8'))
216
  buffered = BytesIO()
 
219
  img_data = f"data:image/png;base64,{img_str}"
220
  datasets[current_dataset_name].append({'image': img_data, 'prompt': prompt})
221
  dataset = datasets[current_dataset_name]
222
+ # Reset page number to 0 when a new entry is added
223
+ page_number = 0
224
+ html_content = display_dataset_html(dataset, page_number=page_number)
225
  # Update entry_selector options
226
  entry_options = [f"{idx}: {entry['prompt'][:30]}" for idx, entry in enumerate(dataset)]
227
+ return datasets, page_number, gr.update(value=html_content), gr.update(choices=entry_options), f"Entry added to dataset '{current_dataset_name}'."
228
 
229
  add_button.click(
230
  add_entry,
231
  inputs=[image_input, prompt_input, current_dataset_name, datasets],
232
+ outputs=[datasets, current_page_number, gr.HTML(), entry_selector, message_box]
233
  )
234
 
235
  with gr.Tab("Edit / Delete Entry"):
 
260
  outputs=[selected_image, selected_prompt]
261
  )
262
 
263
+ def edit_entry(entry_option, new_prompt, current_dataset_name, datasets, current_page_number):
264
  if not current_dataset_name:
265
+ return datasets, gr.update(), gr.update(), gr.update(), gr.update(), "No dataset selected."
266
  if not entry_option or not new_prompt.strip():
267
+ return datasets, gr.update(), gr.update(), gr.update(), gr.update(), "Please select an entry and provide a new prompt."
268
  index = int(entry_option.split(":")[0])
269
  datasets[current_dataset_name][index]['prompt'] = new_prompt
270
  dataset = datasets[current_dataset_name]
271
+ html_content = display_dataset_html(dataset, page_number=current_page_number)
272
  # Update entry_selector options
273
  entry_options = [f"{idx}: {entry['prompt'][:30]}" for idx, entry in enumerate(dataset)]
274
+ return datasets, gr.update(value=html_content), gr.update(choices=entry_options), gr.update(value=""), gr.update(), f"Entry {index} updated."
275
 
276
  edit_button.click(
277
  edit_entry,
278
+ inputs=[entry_selector, new_prompt_input, current_dataset_name, datasets, current_page_number],
279
+ outputs=[datasets, gr.HTML(), entry_selector, new_prompt_input, message_box]
280
  )
281
 
282
+ def delete_entry(entry_option, current_dataset_name, datasets, current_page_number):
283
  if not current_dataset_name:
284
+ return datasets, gr.update(), gr.update(), gr.update(), gr.update(), gr.update(), "No dataset selected."
285
  if not entry_option:
286
+ return datasets, gr.update(), gr.update(), gr.update(), gr.update(), gr.update(), "Please select an entry to delete."
287
  index = int(entry_option.split(":")[0])
288
  del datasets[current_dataset_name][index]
289
  dataset = datasets[current_dataset_name]
290
+ html_content = display_dataset_html(dataset, page_number=current_page_number)
291
  # Update entry_selector options
292
  entry_options = [f"{idx}: {entry['prompt'][:30]}" for idx, entry in enumerate(dataset)]
293
+ return datasets, gr.update(value=html_content), gr.update(choices=entry_options), gr.update(value=None), gr.update(value=""), message_box, f"Entry {index} deleted."
294
 
295
  delete_button.click(
296
  delete_entry,
297
+ inputs=[entry_selector, current_dataset_name, datasets, current_page_number],
298
+ outputs=[datasets, gr.HTML(), entry_selector, selected_image, selected_prompt, message_box]
299
  )
300
 
301
  with gr.Tab("Download Dataset"):
 
320
  outputs=[download_output, message_box]
321
  )
322
 
323
+ # Dataset Viewer and Pagination Controls at the Bottom
324
+ with gr.Column():
325
+ gr.Markdown("### Dataset Viewer")
326
+ dataset_html = gr.HTML()
327
+ with gr.Row():
328
+ prev_button = gr.Button("Previous Page")
329
+ next_button = gr.Button("Next Page")
330
+
331
+ def change_page(action, current_page_number, datasets, current_dataset_name):
332
+ if not current_dataset_name:
333
+ return current_page_number, gr.update(), "No dataset selected."
334
+ dataset = datasets[current_dataset_name]
335
+ total_pages = (len(dataset) - 1) // 5 + 1
336
+ if action == "next":
337
+ if current_page_number + 1 < total_pages:
338
+ current_page_number += 1
339
+ elif action == "prev":
340
+ if current_page_number > 0:
341
+ current_page_number -= 1
342
+ html_content = display_dataset_html(dataset, page_number=current_page_number)
343
+ return current_page_number, gr.update(value=html_content), ""
344
+
345
+ prev_button.click(
346
+ change_page,
347
+ inputs=["prev", current_page_number, datasets, current_dataset_name],
348
+ outputs=[current_page_number, dataset_html, message_box]
349
+ )
350
+
351
+ next_button.click(
352
+ change_page,
353
+ inputs=["next", current_page_number, datasets, current_dataset_name],
354
+ outputs=[current_page_number, dataset_html, message_box]
355
+ )
356
+
357
  # Initialize dataset_selector and entry_selector
358
  def initialize_components(datasets):
359
  return gr.update(choices=list(datasets.keys())), gr.update(choices=[])