Spaces:
Runtime error
Runtime error
import streamlit as st | |
import svgwrite | |
from PIL import Image | |
import urllib.request | |
DEFAULT_CARD_WIDTH = 75 | |
DEFAULT_CARD_HEIGHT = 100 | |
PARTS = {"background": ["white", "black", "red", "blue", "green", "yellow"], | |
"suit": ["clubs", "diamonds", "hearts", "spades"], | |
"value": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"]} | |
LEVELS = {"level 1": ["common", "uncommon", "rare"], | |
"level 2": ["epic", "legendary", "mythic"], | |
"level 3": ["godlike"]} | |
def draw_card(background, suit, value, level, card_width, card_height): | |
print(f"Background image: {background}") | |
dwg = svgwrite.Drawing(size=(f"{card_width}px", f"{card_height}px")) | |
dwg.add(dwg.rect((0, 0), (card_width, card_height), rx=10, ry=10, fill="white", stroke="black", stroke_width=2)) | |
# Add background image, if provided | |
if background: | |
img = Image.open(background) | |
print("Image opened successfully") | |
img = img.resize((card_width, card_height)) | |
img.save(background) | |
print("Image resized and saved successfully") | |
img = svgwrite.image.Image(href=background, size=(f"{card_width}px", f"{card_height}px")) | |
dwg.add(img) | |
# Add suit and value labels | |
suit = svgwrite.text.Text(suit.upper(), insert=(5, 15), fill="black", font_size="16px", font_weight="bold") | |
dwg.add(suit) | |
value = svgwrite.text.Text(value, insert=(5, card_height - 10), fill="black", font_size="16px", font_weight="bold") | |
dwg.add(value) | |
# Add level label | |
level = svgwrite.text.Text(level.upper(), insert=(card_width - 50, card_height - 10), fill="black", font_size="12px", font_weight="bold") | |
svg_string = dwg.tostring() | |
return svg_string | |
def display_parts_selection(): | |
selected_parts = {} | |
for part, options in PARTS.items(): | |
selected_parts[part] = st.sidebar.selectbox(f"Select {part}", options) | |
return selected_parts | |
def display_level_selection(): | |
selected_level = st.sidebar.selectbox("Select Level", list(LEVELS.keys())) | |
return selected_level | |
def display_size_selection(default_width, default_height): | |
card_width = st.sidebar.slider("Card Width", min_value=50, max_value=150, value=default_width, step=5) | |
card_height = st.sidebar.slider("Card Height", min_value=75, max_value=200, value=default_height, step=5) | |
return card_width, card_height | |
def display_image_uploadold(): | |
uploaded_file = st.sidebar.file_uploader("Upload Card Background Image", type=["png", "jpg", "jpeg"]) | |
if uploaded_file is not None: | |
image = Image.open(uploaded_file) | |
image.save("background.png") | |
return "background.png" | |
else: | |
return None | |
def display_image_upload(): | |
uploaded_file = st.sidebar.file_uploader("Upload Card Background Image", type=["png", "jpg", "jpeg"]) | |
if uploaded_file is not None: | |
image = Image.open(uploaded_file) | |
image_name = uploaded_file.name | |
image.save(image_name) | |
return image_name | |
else: | |
return None | |
def display_card(selected_parts, selected_level, card_width, card_height, background): | |
card_svg = draw_card(background, selected_parts["suit"], selected_parts["value"], selected_level, card_width, card_height) | |
st.write(f'<svg viewBox="0 0 {card_width} {card_height}">{card_svg}</svg>', unsafe_allow_html=True) | |
# Create a download link for the card SVG | |
svg_content = '<?xml version="1.0" encoding="utf-8" ?>' + card_svg | |
st.download_button("Download Card as SVG", svg_content, "card.svg", "text/plain") | |
# Create button to level up card | |
if selected_level != "level 3": | |
if st.button("Level Up"): | |
current_level_index = list(LEVELS.keys()).index(selected_level) | |
new_level = list(LEVELS.keys())[current_level_index + 1] | |
selected_level = new_level | |
st.sidebar.warning(f"Card has been leveled up to {selected_level}") | |
st.set_page_config(page_title="Card Evolution Game", page_icon=":hearts:") | |
selected_parts = display_parts_selection() | |
selected_level = display_level_selection() | |
card_width, card_height = display_size_selection(DEFAULT_CARD_WIDTH, DEFAULT_CARD_HEIGHT) | |
background = display_image_upload() | |
display_card(selected_parts, selected_level, card_width, card_height, background) | |