How to get value from html?

Hello!

I would like to integrate my periodic table created by html and Streamlit.

First, I introduce my periodic table as following, the function of this is to display clicked elements.

index.html

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Material Database</title>
    <style>
        * {
            margin: 0;
            font-family: Arial, Helvetica, sans-serif;
            font-weight: 600;
        }

        td {
            width: 5vw;
            /*border: 1px solid gray;*/
            text-align: center;
        }

        .noBorder {
            border: none;
        }

        .headingOne {
            color: white;
            background-color: blue;
            padding: 5px;
            font-size: 5vw;
        }

        ._color_1 {
            background-color: #ff9966;
        }

        .color_2 {
            background-color: #dda0dd;
        }

        .color_3 {
            background-color: #90c7ff;
        }

        .color_4 {
            background-color: #fceff0;
        }

        .color_5 {
            background-color: #fff28e;
        }

        .color_6 {
            background-color: #c79810;
        }

        .color_7 {
            background-color: #cdeb8b;
        }

        .color_8 {
            background-color: #ebdca9;
        }

        .color_9 {
            background-color: #e6e6fa;
        }

        ._button {
            font-size: 1.5em;
            width: 58px;
            height: 70px;
            padding: 4px 6px;
            font-weight: bold;
        }

        .text_color_green {
            color: green;
        }

        .text_color_blue {
            color: blue;
        }

        .text_color_red {
            color: red;
        }
    </style>

    <script type="text/javascript"><!--
        function addTF(str)
        {
            document.compoundForm.compound.value += str;
        }
    // --></script>
</head>

<body>
    <center>
        <!--<h1 class="headingOne">Material Database</h1>-->
        <!--<h2>Select the component elements in the periodic table below.</h2>-->
        <table>
            <tr>
                <td><button class="_color_1 _button text_color_green" value="H" onClick="addTF(this.value)">1<br/>H</button></td>
                <td class="noBorder" colspan="16"></td>
                <td><button class="color_9 _button text_color_green" value="He" onClick="addTF(this.value)">2<br/>He</button></td>
            </tr>
            <tr>
                <td><button class="color_2 _button" value="Li" onClick="addTF(this.value)">3<br/>Li</button></td>
                <td><button class="color_3 _button" value="Be" onClick="addTF(this.value)">4<br/>Be</button></td>
                <td class="noBorder" colspan="10"></td>
                <td><button class="color_6 _button" value="B" onClick="addTF(this.value)">5<br/>B</button></td>
                <td><button class="_color_1 _button" value="C" onClick="addTF(this.value)">6<br/>C</button></td>
                <td><button class="_color_1 _button text_color_green" value="N" onClick="addTF(this.value)">7<br/>N</button></td>
                <td><button class="_color_1 _button text_color_green" value="O" onClick="addTF(this.value)">8<br/>O</button></td>
                <td><button class="color_8 _button text_color_green" value="F" onClick="addTF(this.value)">9<br/>F</button></td>
                <td><button class="color_9 _button text_color_green" value="Ne" onClick="addTF(this.value)">10<br/>Ne</button></td>
            </tr>
            <tr>
                <td><button class="color_2 _button" value="Na" onClick="addTF(this.value)">11<br/>Na</button></td>
                <td><button class="color_3 _button" value="Mg" onClick="addTF(this.value)">12<br/>Mg</button></td>
                <td class="noBorder" colspan="10"></td>
                <td><button class="color_7 _button" value="Al" onClick="addTF(this.value)">13<br/>Al</button></td>
                <td><button class="color_6 _button" value="Si" onClick="addTF(this.value)">14<br/>Si</button></td>
                <td><button class="_color_1 _button" value="P" onClick="addTF(this.value)">15<br/>P</button></td>
                <td><button class="_color_1 _button" value="S" onClick="addTF(this.value)">16<br/>S</button></td>
                <td><button class="color_8 _button text_color_green" value="Cl" onClick="addTF(this.value)">17<br/>Cl</button></td>
                <td><button class="color_9 _button text_color_green" value="Ar" onClick="addTF(this.value)">18<br/>Ar</button></td>
            </tr>
            <tr>
                <td><button class="color_2 _button" value="K" onClick="addTF(this.value)">19<br/>K</button></td>
                <td><button class="color_3 _button" value="Ca" onClick="addTF(this.value)">20<br/>Ca</button></td>
                <td><button class="color_5 _button" value="Sc" onClick="addTF(this.value)">21<br/>Sc</button></td>
                <td><button class="color_5 _button" value="Ti" onClick="addTF(this.value)">22<br/>Ti</button></td>
                <td><button class="color_5 _button" value="V" onClick="addTF(this.value)">23<br/>V</button></td>
                <td><button class="color_5 _button" value="Cr" onClick="addTF(this.value)">24<br/>Cr</button></td>
                <td><button class="color_5 _button" value="Mn" onClick="addTF(this.value)">25<br/>Mn</button></td>
                <td><button class="color_5 _button" value="Fe" onClick="addTF(this.value)">26<br/>Fe</button></td>
                <td><button class="color_5 _button" value="Co" onClick="addTF(this.value)">27<br/>Co</button></td>
                <td><button class="color_5 _button" value="Ni" onClick="addTF(this.value)">28<br/>Ni</button></td>
                <td><button class="color_5 _button" value="Cu" onClick="addTF(this.value)">29<br/>Cu</button></td>
                <td><button class="color_5 _button" value="Zn" onClick="addTF(this.value)">30<br/>Zn</button></td>
                <td><button class="color_7 _button text_color_blue" value="Ga" onClick="addTF(this.value)">31<br/>Ga</button></td>
                <td><button class="color_6 _button" value="Ge" onClick="addTF(this.value)">32<br/>Ge</button></td>
                <td><button class="color_6 _button" value="As" onClick="addTF(this.value)">33<br/>As</button></td>
                <td><button class="_color_1 _button" value="Se" onClick="addTF(this.value)">34<br/>Se</button></td>
                <td><button class="color_8 _button text_color_blue" value="Br" onClick="addTF(this.value)">35<br/>Br</button></td>
                <td><button class="color_9 _button text_color_green" value="Kr" onClick="addTF(this.value)">36<br/>Kr</button></td>
            </tr>
            <tr>
                <td><button class="color_2 _button" value="Kr" onClick="addTF(this.value)">37<br/>Rb</button></td>
                <td><button class="color_3 _button" value="Sr" onClick="addTF(this.value)">38<br/>Sr</button></td>
                <td><button class="color_5 _button" value="Y" onClick="addTF(this.value)">39<br/>Y</button></td>
                <td><button class="color_5 _button" value="Zr" onClick="addTF(this.value)">40<br/>Zr</button></td>
                <td><button class="color_5 _button" value="Nb" onClick="addTF(this.value)">41<br/>Nb</button></td>
                <td><button class="color_5 _button" value="Mo" onClick="addTF(this.value)">42<br/>Mo</button></td>
                <td><button class="color_5 _button" value="Tc" onClick="addTF(this.value)">43<br/>Tc</button></td>
                <td><button class="color_5 _button" value="Ru" onClick="addTF(this.value)">44<br/>Ru</button></td>
                <td><button class="color_5 _button" value="Rh" onClick="addTF(this.value)">45<br/>Rh</button></td>
                <td><button class="color_5 _button" value="Pd" onClick="addTF(this.value)">46<br/>Pd</button></td>
                <td><button class="color_5 _button" value="Ag" onClick="addTF(this.value)">47<br/>Ag</button></td>
                <td><button class="color_5 _button" value="Ag" onClick="addTF(this.value)">48<br/>Cd</button></td>
                <td><button class="color_7 _button" value="In" onClick="addTF(this.value)">49<br/>In</button></td>
                <td><button class="color_7 _button" value="Sn" onClick="addTF(this.value)">50<br/>Sn</button></td>
                <td><button class="color_6 _button" value="Sb" onClick="addTF(this.value)">51<br/>Sb</button></td>
                <td><button class="color_6 _button" value="Te" onClick="addTF(this.value)">52<br/>Te</button></td>
                <td><button class="color_8 _button" value="I" onClick="addTF(this.value)">53<br/>I</button></td>
                <td><button class="color_9 _button text_color_green" value="Xe" onClick="addTF(this.value)">54<br/>Xe</button></td>
            </tr>
            <tr>
                <td><button class="color_2 _button text_color_blue" value="Cs" onClick="addTF(this.value)">55<br/>Cs</button></td>
                <td><button class="color_3 _button text_color_blue" value="Ba" onClick="addTF(this.value)">56<br/>Ba</button></td>
                <td><button class="color_4 _button">57-71<br />&nbsp;</button></td>
                <td><button class="color_5 _button" value="Hf" onClick="addTF(this.value)">72<br/>Hf</button></td>
                <td><button class="color_5 _button" value="Ta" onClick="addTF(this.value)">73<br/>Ta</button></td>
                <td><button class="color_5 _button" value="W" onClick="addTF(this.value)">74<br/>W</button></td>
                <td><button class="color_5 _button" value="Re" onClick="addTF(this.value)">75<br/>Re</button></td>
                <td><button class="color_5 _button" value="Os" onClick="addTF(this.value)">76<br/>Os</button></td>
                <td><button class="color_5 _button" value="Ir" onClick="addTF(this.value)">77<br/>Ir</button></td>
                <td><button class="color_5 _button" value="Pt" onClick="addTF(this.value)">78<br/>Pt</button></td>
                <td><button class="color_5 _button" value="Au" onClick="addTF(this.value)">79<br/>Au</button></td>
                <td><button class="color_5 _button text_color_blue" value="Hg" onClick="addTF(this.value)">80<br/>Hg</button></td>
                <td><button class="color_7 _button" value="Tl" onClick="addTF(this.value)">81<br/>Tl</button></td>
                <td><button class="color_7 _button" value="Pb" onClick="addTF(this.value)">82<br/>Pb</button></td>
                <td><button class="color_7 _button" value="Bi" onClick="addTF(this.value)">83<br/>Bi</button></td>
                <td><button class="color_6 _button" value="Po" onClick="addTF(this.value)">84<br/>Po</button></td>
                <td><button class="color_8 _button" value="At" onClick="addTF(this.value)">85<br/>At</button></td>
                <td><button class="color_9 _button text_color_green" value="Rn" onClick="addTF(this.value)">86<br/>Rn</button></td>
            </tr>
            <tr>
                <td><button class="color_2 _button text_color_blue" value="Fr" onClick="addTF(this.value)">87<br/>Fr</button></td>
                <td><button class="color_3 _button" value="Ra" onClick="addTF(this.value)">88<br/>Ra</button></td>
                <td><button class="color_4 _button" value="Ra" onClick="addTF(this.value)">89-103<br />&nbsp;</button></td>
                <td><button class="color_5 _button text_color_red" value="Rf" onClick="addTF(this.value)">104<br/>Rf</button></td>
                <td><button class="color_5 _button text_color_red" value="Db" onClick="addTF(this.value)">105<br/>Db</button></td>
                <td><button class="color_5 _button text_color_red" value="Sg" onClick="addTF(this.value)">106<br/>Sg</button></td>
                <td><button class="color_5 _button text_color_red" value="Bh" onClick="addTF(this.value)">107<br/>Bh</button></td>
                <td><button class="color_5 _button text_color_red" value="Hs" onClick="addTF(this.value)">108<br/>Hs</button></td>
                <td><button class="color_5 _button text_color_red" value="Mt" onClick="addTF(this.value)">109<br/>Mt</button></td>
                <td><button class="color_5 _button text_color_red" value="Ds" onClick="addTF(this.value)">110<br/>Ds</button></td>
                <td><button class="color_5 _button text_color_red" value="Rg" onClick="addTF(this.value)">111<br/>Rg</button></td>
                <td><button class="color_5 _button text_color_red" value="Cn" onClick="addTF(this.value)">112<br/>Cn</button></td>
                <td><button class="color_5 _button text_color_red" value="Nh" onClick="addTF(this.value)">113<br/>Nh</button></td>
                <td><button class="color_5 _button text_color_red" value="Fl" onClick="addTF(this.value)">114<br/>Fl</button></td>
                <td><button class="color_4 _button text_color_red" value="Mc" onClick="addTF(this.value)">115<br/>Mc</button></td>
                <td><button class="color_4 _button text_color_red" value="Lv" onClick="addTF(this.value)">116<br/>Lv</button></td>
                <td><button class="color_4 _button text_color_red" value="Ts" onClick="addTF(this.value)">117<br/>Ts</button></td>
                <td><button class="color_4 _button text_color_red" value="Og" onClick="addTF(this.value)">118<br/>Og</button></td>
            </tr>
            <tr>
                <td class="noBorder"></td>
            </tr>
            <tr>
                <td class="noBorder" colspan="2" rowspan="2"></td>
                <td><button class="color_4 _button" value="La" onClick="addTF(this.value)">57<br/>La</button></td>
                <td><button class="color_4 _button" value="Ce" onClick="addTF(this.value)">58<br/>Ce</button></td>
                <td><button class="color_4 _button" value="Pr" onClick="addTF(this.value)">59<br/>Pr</button></td>
                <td><button class="color_4 _button" value="Nd" onClick="addTF(this.value)">60<br/>Nd</button></td>
                <td><button class="color_4 _button text_color_red" value="Pm" onClick="addTF(this.value)">61<br/>Pm</button></td>
                <td><button class="color_4 _button" value="Sm" onClick="addTF(this.value)">62<br/>Sm</button></td>
                <td><button class="color_4 _button" value="Eu" onClick="addTF(this.value)">63<br/>Eu</button></td>
                <td><button class="color_4 _button" value="Gd" onClick="addTF(this.value)">64<br/>Gd</button></td>
                <td><button class="color_4 _button" value="Tb" onClick="addTF(this.value)">65<br/>Tb</button></td>
                <td><button class="color_4 _button" value="Dy" onClick="addTF(this.value)">66<br/>Dy</button></td>
                <td><button class="color_4 _button" value="Ho" onClick="addTF(this.value)">67<br/>Ho</button></td>
                <td><button class="color_4 _button" value="Er" onClick="addTF(this.value)">68<br/>Er</button></td>
                <td><button class="color_4 _button" value="Tm" onClick="addTF(this.value)">69<br/>Tm</button></td>
                <td><button class="color_4 _button" value="Yb" onClick="addTF(this.value)">70<br/>Yb</button></td>
                <td><button class="color_4 _button" value="Lu" onClick="addTF(this.value)">71<br/>Lu</button></td>
                <td class="noBorder" colspan="1" rowspan="1"></td>
            </tr>
            <tr>
                <td><button class="color_4 _button" value="Ac" onClick="addTF(this.value)">89<br/>Ac</button></td>
                <td><button class="color_4 _button" value="Th" onClick="addTF(this.value)">90<br/>Th</button></td>
                <td><button class="color_4 _button" value="Pa" onClick="addTF(this.value)">91<br/>Pa</button></td>
                <td><button class="color_4 _button" value="U" onClick="addTF(this.value)">92<br/>U</button></td>
                <td><button class="color_4 _button text_color_red" value="Np" onClick="addTF(this.value)">93<br/>Np</button></td>
                <td><button class="color_4 _button text_color_red" value="Pu" onClick="addTF(this.value)">94<br/>Pu</button></td>
                <td><button class="color_4 _button text_color_red" value="Am" onClick="addTF(this.value)">95<br/>Am</button></td>
                <td><button class="color_4 _button text_color_red" value="Cm" onClick="addTF(this.value)">96<br/>Cm</button></td>
                <td><button class="color_4 _button text_color_red" value="Bk" onClick="addTF(this.value)">97<br/>Bk</button></td>
                <td><button class="color_4 _button text_color_red" value="Cf" onClick="addTF(this.value)">98<br/>Cf</button></td>
                <td><button class="color_4 _button text_color_red" value="Es" onClick="addTF(this.value)">99<br/>Es</button></td>
                <td><button class="color_4 _button text_color_red" value="Fm" onClick="addTF(this.value)">100<br/>Fm</button></td>
                <td><button class="color_4 _button text_color_red" value="Md" onClick="addTF(this.value)">101<br/>Md</button></td>
                <td><button class="color_4 _button text_color_red" value="No" onClick="addTF(this.value)">102<br/>No</button></td>
                <td><button class="color_4 _button text_color_red" value="Lr" onClick="addTF(this.value)">103<br/>Lr</button></td>
            </tr>
        </table>

        <form name="compoundForm">
            <input type="text" name="compound"><br>
            <input type="submit" value="Submit">
            <input type="reset" value="Reset"><br>
        </form>
    </center>
</body>

</html>

I think if I can get the value sent to compoundForm via Streamlit I can do what I want, but I donโ€™t know how.

The following code is my prototype, so I will share it for reference.

app.py

import streamlit as st
import streamlit.components.v1 as stc

with open("index.html", "r") as f:
    text = f.read()
    
stc.html(text, width=1200, height=650)

selected = **THE METHOD OF GETTING VALUE FROM HTML**

selected

Please give me your idea, thank you.

Hello @BananaTonic, welcome to the community!

Your method of rendering HTML in Streamlit works, unfortunately you wonโ€™t be able to pass data from HTML to Streamlit with stc.html as itโ€™s reserved to rendering static components.

You will need to use Streamlit.setComponentValue method inside the bidirectional component part to return a value to Streamlit on a JS event (like clicking the Submit button). You can check the vanilla Typescript version of a bidirectional component here to get an overview of how it looks like, especially the index.tsx file.

Donโ€™t hesitate if you have further questions,
Fanilo

Hi @andfanilo, thank you for your quick reply.
OK, I will try a bidirectional component you proposed.