Spaces:
Sleeping
Sleeping
Update app2.py
Browse files
app2.py
CHANGED
|
@@ -496,164 +496,6 @@ def generate_qr_codes(data: Union[str, Dict, List], combined: bool = True) -> Li
|
|
| 496 |
logger.error(f"QR code generation error: {e}")
|
| 497 |
return []
|
| 498 |
|
| 499 |
-
def create_modern_interface():
|
| 500 |
-
"""Create a modern and visually appealing Gradio interface"""
|
| 501 |
-
|
| 502 |
-
# Modern CSS styling
|
| 503 |
-
css = """
|
| 504 |
-
/* Modern color scheme */
|
| 505 |
-
:root {
|
| 506 |
-
--primary-color: #1a365d;
|
| 507 |
-
--secondary-color: #2d3748;
|
| 508 |
-
--accent-color: #4299e1;
|
| 509 |
-
--background-color: #f7fafc;
|
| 510 |
-
--success-color: #48bb78;
|
| 511 |
-
--error-color: #f56565;
|
| 512 |
-
--warning-color: #ed8936;
|
| 513 |
-
}
|
| 514 |
-
/* Container styling */
|
| 515 |
-
.container {
|
| 516 |
-
max-width: 1200px;
|
| 517 |
-
margin: auto;
|
| 518 |
-
padding: 2rem;
|
| 519 |
-
background-color: var(--background-color);
|
| 520 |
-
border-radius: 1rem;
|
| 521 |
-
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
|
| 522 |
-
}
|
| 523 |
-
/* Component styling */
|
| 524 |
-
.input-container {
|
| 525 |
-
background-color: white;
|
| 526 |
-
padding: 1.5rem;
|
| 527 |
-
border-radius: 0.5rem;
|
| 528 |
-
border: 1px solid #e2e8f0;
|
| 529 |
-
margin-bottom: 1rem;
|
| 530 |
-
}
|
| 531 |
-
/* Button styling */
|
| 532 |
-
.primary-button {
|
| 533 |
-
background-color: var(--primary-color);
|
| 534 |
-
color: white;
|
| 535 |
-
padding: 0.75rem 1.5rem;
|
| 536 |
-
border-radius: 0.375rem;
|
| 537 |
-
border: none;
|
| 538 |
-
cursor: pointer;
|
| 539 |
-
transition: all 0.2s;
|
| 540 |
-
}
|
| 541 |
-
.primary-button:hover {
|
| 542 |
-
background-color: var(--accent-color);
|
| 543 |
-
transform: translateY(-1px);
|
| 544 |
-
}
|
| 545 |
-
/* Status messages */
|
| 546 |
-
.status {
|
| 547 |
-
padding: 1rem;
|
| 548 |
-
border-radius: 0.375rem;
|
| 549 |
-
margin: 1rem 0;
|
| 550 |
-
}
|
| 551 |
-
.status.success { background-color: #f0fff4; color: var(--success-color); }
|
| 552 |
-
.status.error { background-color: #fff5f5; color: var(--error-color); }
|
| 553 |
-
.status.warning { background-color: #fffaf0; color: var(--warning-color); }
|
| 554 |
-
/* Gallery styling */
|
| 555 |
-
.gallery {
|
| 556 |
-
display: grid;
|
| 557 |
-
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
|
| 558 |
-
gap: 1rem;
|
| 559 |
-
padding: 1rem;
|
| 560 |
-
background-color: white;
|
| 561 |
-
border-radius: 0.5rem;
|
| 562 |
-
border: 1px solid #e2e8f0;
|
| 563 |
-
}
|
| 564 |
-
.gallery img {
|
| 565 |
-
width: 100%;
|
| 566 |
-
height: auto;
|
| 567 |
-
border-radius: 0.375rem;
|
| 568 |
-
transition: transform 0.2s;
|
| 569 |
-
}
|
| 570 |
-
.gallery img:hover {
|
| 571 |
-
transform: scale(1.05);
|
| 572 |
-
}
|
| 573 |
-
/* QR Code Viewport Styling */
|
| 574 |
-
.viewport-container {
|
| 575 |
-
display: grid;
|
| 576 |
-
gap: 0.5rem;
|
| 577 |
-
padding: 1rem;
|
| 578 |
-
background-color: white;
|
| 579 |
-
border-radius: 0.5rem;
|
| 580 |
-
border: 1px solid #e2e8f0;
|
| 581 |
-
margin-top: 1rem;
|
| 582 |
-
}
|
| 583 |
-
.viewport-item {
|
| 584 |
-
display: flex;
|
| 585 |
-
flex-direction: column;
|
| 586 |
-
align-items: center;
|
| 587 |
-
}
|
| 588 |
-
.viewport-item img {
|
| 589 |
-
width: 100%;
|
| 590 |
-
height: auto;
|
| 591 |
-
border-radius: 0.375rem;
|
| 592 |
-
transition: transform 0.2s;
|
| 593 |
-
max-width: 150px; /* Adjust as needed */
|
| 594 |
-
max-height: 150px; /* Adjust as needed */
|
| 595 |
-
}
|
| 596 |
-
"""
|
| 597 |
-
# Create interface with modern design
|
| 598 |
-
with gr.Blocks(css=css, title="Advanced Data Processor & QR Generator") as interface:
|
| 599 |
-
interface.head += """
|
| 600 |
-
<script>
|
| 601 |
-
let enabledStates = [];
|
| 602 |
-
|
| 603 |
-
function updateEnabledStates(checkbox) {
|
| 604 |
-
const index = parseInt(checkbox.dataset.index);
|
| 605 |
-
if (checkbox.checked) {
|
| 606 |
-
if (!enabledStates.includes(index)) {
|
| 607 |
-
enabledStates.push(index);
|
| 608 |
-
}
|
| 609 |
-
} else {
|
| 610 |
-
enabledStates = enabledStates.filter(item => item !== index);
|
| 611 |
-
}
|
| 612 |
-
// Send the updated state back to Gradio (you might need to adjust the target component)
|
| 613 |
-
const enabled_qr_codes_component = document.querySelector('[data-component-type="state"][data-state-name="enabled_qr_codes"]');
|
| 614 |
-
if (enabled_qr_codes_component) {
|
| 615 |
-
enabled_qr_codes_component.value = JSON.stringify(enabledStates);
|
| 616 |
-
enabled_qr_codes_component.dispatchEvent(new Event('input')); // Trigger update
|
| 617 |
-
}
|
| 618 |
-
console.log("Enabled QR Code Indices:", enabledStates);
|
| 619 |
-
// You might want to trigger an update of the viewport here if needed
|
| 620 |
-
}
|
| 621 |
-
</script>
|
| 622 |
-
"""
|
| 623 |
-
qr_code_paths = gr.State([])
|
| 624 |
-
# ... (rest of the Gradio interface definition) ...
|
| 625 |
-
with gr.Tab("🖼️ QR Code Viewport") as viewport_tab:
|
| 626 |
-
viewport_output = gr.HTML(label="QR Code Sequence Viewport")
|
| 627 |
-
enabled_qr_codes = gr.State([]) # To store the enabled/disabled state
|
| 628 |
-
# ... (rest of the function) ...
|
| 629 |
-
viewport_tab.select(update_viewport, inputs=[qr_code_paths, enabled_qr_codes], outputs=[viewport_output])
|
| 630 |
-
# ... (rest of the function) ...
|
| 631 |
-
Important Considerations and Next Steps:
|
| 632 |
-
|
| 633 |
-
State Management: The JavaScript code updates a global variable enabledStates. While this works for a basic example, for more complex applications, you might want to manage the state more robustly within Gradio.
|
| 634 |
-
Viewport Update: Currently, the viewport is updated only when you switch to the "QR Code Viewport" tab. If you want the viewport to update immediately after enabling/disabling a QR code, you'll need to trigger the update_viewport function from the JavaScript code. This typically involves using Gradio's Remote Functions or a submit button.
|
| 635 |
-
Visualization of Result: The current implementation visualizes the enabled state with a green border. You might have a different idea for how the "result" of enabling/disabling should be visualized.
|
| 636 |
-
Scalability: For a very large number of QR codes, rendering all of them in HTML might become inefficient. You might need to consider techniques like pagination or virtualization.
|
| 637 |
-
With these changes, the application will now have a basic QR Code Viewport with enable/disable functionality. You can further refine the UI and the interaction based on your specific needs.
|
| 638 |
-
|
| 639 |
-
|
| 640 |
-
|
| 641 |
-
|
| 642 |
-
|
| 643 |
-
|
| 644 |
-
its not letting me add my expected filetypes?
|
| 645 |
-
|
| 646 |
-
|
| 647 |
-
|
| 648 |
-
Show thinking
|
| 649 |
-
You are right to point that out. My apologies for the continued oversight. While the intent with file_types=["*"] was to be open, Gradio's gr.File component might interpret that differently or it might not be the intended way to accept all types.
|
| 650 |
-
|
| 651 |
-
According to the Gradio documentation, to accept all file types, you should set the file_types parameter to None.
|
| 652 |
-
|
| 653 |
-
Let's make that change in the create_modern_interface function. Here's the updated section:
|
| 654 |
-
|
| 655 |
-
Python
|
| 656 |
-
|
| 657 |
def create_modern_interface():
|
| 658 |
"""Create a modern and visually appealing Gradio interface"""
|
| 659 |
|
|
|
|
| 496 |
logger.error(f"QR code generation error: {e}")
|
| 497 |
return []
|
| 498 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 499 |
def create_modern_interface():
|
| 500 |
"""Create a modern and visually appealing Gradio interface"""
|
| 501 |
|