python系列&deep_study系列:Gradio中文教程(十一)State in Blocks
Gradio中文教程(十一)State in Blocks
Gradio中文教程(十一)State in Blocks
块中的状态
我们已经在接口中介绍了状态,本指南将探讨块中的状态,它与接口中的状态大部分相同。
全局状态
块中的全局状态与接口中的全局状态相同。在函数调用之外创建的任何变量都是所有用户之间共享的引用。
会话状态
Gradio
支持会话状态,在块应用中,数据在同一页面会话内的多次提交之间保持不变。重申一下,会话数据不会在您的模型的不同用户之间共享。要在会话状态中存储数据,您需要做三件事:
-
创建一个
gr.State()对象
。如果这个有状态对象有一个默认值,将其传递给构造函数。 -
在事件监听器中,将
State对象
作为输入和输出。 -
在事件监听器函数中,将变量添加到输入参数和返回值中。
让我们来看一个吊人游戏的例子。
import gradio as gr
secret_word = "gradio"
with gr.Blocks() as demo:
used_letters_var = gr.State([])
with gr.Row() as row:
with gr.Column():
input_letter = gr.Textbox(label="Enter letter")
btn = gr.Button("Guess Letter")
with gr.Column():
hangman = gr.Textbox(
label="Hangman",
value="_"*len(secret_word)
)
used_letters_box = gr.Textbox(label="Used Letters")
def guess_letter(letter, used_letters):
used_letters.append(letter)
answer = "".join([
(letter if letter in used_letters else "_")
for letter in secret_word
])
return {
used_letters_var: used_letters,
used_letters_box: ", ".join(used_letters),
hangman: answer
}
btn.click(
guess_letter,
[input_letter, used_letters_var],
[used_letters_var, used_letters_box, hangman]
)
demo.launch()
让我们看看在这个游戏中我们如何完成上述三个步骤:
-
我们将已使用的字母存储在
used_letters_var
中。在State
的构造函数中,我们将这个的初始值设置为[],一个空列表。 -
在
btn.click()
中,我们在输入和输出中都有一个对used_letters_var
的引用。 -
在
guess_letter
中,我们将这个State
的值传递给used_letters
,然后在返回语句中返回这个State
的更新值。
对于更复杂的应用,您可能会有许多存储在单个块应用中的会话状态的状态变量。
在文档中了解更多关于State的信息。