代码之家  ›  专栏  ›  技术社区  ›  Elizabeth James

尝试使Streamlight在重新运行应用程序之前等待输入

  •  0
  • Elizabeth James  · 技术社区  · 2 年前

    我正在尝试创建一个游戏,允许用户回答gpt电源提出的问题。我目前正在使用streamlit,但streamlit一直在重新运行应用程序,而不等待响应。我希望streamlight在完全运行其余代码/重新运行之前等待响应/输入。对于某些上下文,消息来源会接受他们的答案,并利用这些答案提出更多问题。

    现在发生的情况是,即使某些字段为空/尚未得到答复,streamlight仍在继续运行。我试图通过制作答案文本框表格来解决这个问题,但仍然没有成功。我还尝试过使用time()和暂停函数,但都没有成功。

    例如,我想让我的用户自我介绍。所以我调用这个函数:

    def run_intro_completion(self, game):
       with st.form(key=‘my_form2’):
          intro_dialogue = st.text_input(label=‘Introduce yourself’)
          submit_button = st.form_submit_button(label=‘Submit’)
       num_tokens = 0
       if submit_button:
          return (intro_dialogue, num_tokens, submit_button)
    

    然而,它一直说我的intro_dialogue变量是Nonetype,因为streamlit在不等待按下提交按钮/填写intro字段的情况下继续执行。对于如何让streamlight像终端一样运行,在进入代码的下一部分之前,它会等待我的用户响应,你有什么建议吗?如有任何帮助,我们将不胜感激。

    非常感谢。

    1 回复  |  直到 2 年前
        1
  •  0
  •   MathCatsAnd    2 年前

    Streamlight的功能与终端不同。当你把一个小部件放在脚本中时,Streamlight会直接通过它,输出是它的默认值。(在表单的情况下,在单击提交按钮之前,小部件输出不会更新,因此当用户在其他地方填写信息或与应用程序交互时,它们将返回默认值,提交按钮将返回False。)

    你的职能只是 return None 在任何不是由提交按钮引起的页面加载上单击。

    无论您在哪里调用函数,都需要检查它返回的值,以了解如何继续。例如(按原样填写函数的返回):

    def run_intro_completion(self, game):
       with st.form(key=‘my_form2’):
          intro_dialogue = st.text_input(label=‘Introduce yourself’)
          submit_button = st.form_submit_button(label=‘Submit’)
       num_tokens = 0
       if submit_button:
          return (intro_dialogue, num_tokens, submit_button)
       # else:
       return None
    

    假设您将对象存储在 st.session_state.my_state

    state = st.session_state.my_state
    result = state.run_intro_completion(my_game)
    if result is not None:
       # Do processing
    

    我不知道你的应用程序的更大结构是什么,所以它可能需要处理其他基本细节,才能适当地处理Streamlit的逻辑结构,即在每次交互时从头到脚重新运行整个脚本。确保要连续更改或构建的任何对象都存储在 st.session_state 正如我所暗示的。