简体   繁体   中英

Streamlit - Cannot repeat emoji string using st.write()

Summary:

Normally to repeat a string in python, you'd use (string * n) where n = number of times to repeat.

In Streamlit you have the ability to print emoji using corresponding shortcodes in st.write() .

I've been able to use st.write(emoji1, emoji2, emoji3) to print emoji successfully, but when I use (string *n) to repeat the emoji string, st.write prints the shortcodes as strings vs printing the actual emoji.

Is this a shortcoming on Streamlit's code, or am I missing something?

Here's the link to the app so you can see:

https://halfgingerbeard-30daysofstreamlit-emoji-frame-creator-bsodkg.streamlit.app/

Tried/Expected:

Using a dataframe of Streamlit-accepted emoji shortcodes as df_emoji:

emoji1 = st.select_slider('Select emoji 1:', options = df_emoji['shortcodes'], value=':sunglasses:')
emoji2 = st.select_slider('Select emoji 2:', options = df_emoji['shortcodes'], value=':white_check_mark:')
emoji3 = st.select_slider('Select emoji 3:', options = df_emoji['shortcodes'], value=':coffee:')

e_columns = st.number_input('Select Number of Columns:',1,10,3)

st.write(emoji1, emoji2, emoji3) # this works successfully

st.write((emoji1, emoji2, emoji3) * e_columns)[:e_columns]) # this prints out the string values of the shortcodes instead of the actual emoji

I'm expecting a repeating concatenated string of emoji the length of e_columns, not each shortcode in string format

eg ( vs ':sunglasses:')

First off, you have a syntax error on your last line:

st.write((emoji1, emoji2, emoji3) * e_columns)[:e_columns])
#                                                         ^ unmatched

Add an extra open paren ( just after st.write :

st.write(((emoji1, emoji2, emoji3) * e_columns)[:e_columns])
#       ^ here

Now, in your first call to st.write() , you are passing each individual shortcode as a separate parameter:

st.write(emoji1, emoji2, emoji3) # 3 parameters

However, in the second call just below it, you are passing it a single parameter - a tuple:

st.write(((emoji1, emoji2, emoji3) * e_columns)[:e_columns]) # just one parameter

Try using the unpacking operator * to separate out each emoji into an individual parameter:

st.write(*((emoji1, emoji2, emoji3) * e_columns)[:e_columns])
#        ^

So, if e_columns is 5, for example, from Python's perspective the actual function call will be

st.write(emoji1, emoji2, emoji3, emoji1, emoji2)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM