guizero Raspberry Pi: 按钮 -> 命令序列问题
guizero Raspberry Pi: button -> command sequence problems
要求:在guizero App上按下一个按钮应该首先设置一个文本值,然后执行一个功能(这里是一个简单的time.sleep();本来是一个子进程);执行该功能后,应显示结果文本;
#!/usr/bin/python3
# -*- coding: utf-8 -*-
from guizero import App, PushButton, Text
import subprocess
import time
# Action you would like to perform
def counter0():
global s0
text0.value = int(text0.value) + 1 # works
text1.value = s0 # works
def counter1():
global s0
text1.value = s0 # display a status value - but does not (!)
time.sleep(1) # originally a subprocess is called here; works
text1.value = "ready" # only diplays this after a delay
s0="start something after pressing butt1"
app = App("Hello world", layout="grid")
text0 = Text(app, text="1", align="left", grid=[0,1])
text1 = Text(app, text=s0, align="left",grid=[0,8] )
butt1 = PushButton(app, text="Button", command=counter1, align="left", grid=[0,2])
text0.repeat(10000, counter0) # Schedule call to counter() every 1000ms
app.display()
很可能我不理解 guizero 背后的想法。对如何管理此类要求有任何想法吗?
如果我没有正确理解你的问题,你的具体问题在这里:
text1.value = s0 # display a status value - but does not (!)
这不起作用,因为 guizero
框架正在同步执行函数:在函数返回之前,不会执行其他代码——包括更新显示的代码。
如果你想:
- 在 运行使用
subprocess
命令之前显示一条消息
- 运行 一些命令
- 命令完成后显示一条消息
然后您将需要重写您的逻辑,这样您的应用程序就不会等待 `counter1 完成。异步 运行 宁代码的一种选择是 运行 它在一个单独的线程中。例如:
from guizero import App, PushButton, Text
import threading
import time
# Action you would like to perform
def counter0():
global s0
text0.value = int(text0.value) + 1 # works
text1.value = s0 # works
def run_command():
time.sleep(1) # originally a subprocess is called here; works
text1.value = "ready" # only diplays this after a delay
def counter1():
global s0
text1.value = "Running command..."
threading.Thread(target=run_command).start()
s0 = "start something after pressing butt1"
app = App("Hello world", layout="grid")
text0 = Text(app, text="1", align="left", grid=[0, 1])
text1 = Text(app, text=s0, align="left", grid=[0, 8])
butt1 = PushButton(app, text="Button", command=counter1,
align="left", grid=[0, 2])
text0.repeat(10000, counter0)
app.display()
运行使用上面的代码会给你以下行为:
要求:在guizero App上按下一个按钮应该首先设置一个文本值,然后执行一个功能(这里是一个简单的time.sleep();本来是一个子进程);执行该功能后,应显示结果文本;
#!/usr/bin/python3
# -*- coding: utf-8 -*-
from guizero import App, PushButton, Text
import subprocess
import time
# Action you would like to perform
def counter0():
global s0
text0.value = int(text0.value) + 1 # works
text1.value = s0 # works
def counter1():
global s0
text1.value = s0 # display a status value - but does not (!)
time.sleep(1) # originally a subprocess is called here; works
text1.value = "ready" # only diplays this after a delay
s0="start something after pressing butt1"
app = App("Hello world", layout="grid")
text0 = Text(app, text="1", align="left", grid=[0,1])
text1 = Text(app, text=s0, align="left",grid=[0,8] )
butt1 = PushButton(app, text="Button", command=counter1, align="left", grid=[0,2])
text0.repeat(10000, counter0) # Schedule call to counter() every 1000ms
app.display()
很可能我不理解 guizero 背后的想法。对如何管理此类要求有任何想法吗?
如果我没有正确理解你的问题,你的具体问题在这里:
text1.value = s0 # display a status value - but does not (!)
这不起作用,因为 guizero
框架正在同步执行函数:在函数返回之前,不会执行其他代码——包括更新显示的代码。
如果你想:
- 在 运行使用
subprocess
命令之前显示一条消息
- 运行 一些命令
- 命令完成后显示一条消息
然后您将需要重写您的逻辑,这样您的应用程序就不会等待 `counter1 完成。异步 运行 宁代码的一种选择是 运行 它在一个单独的线程中。例如:
from guizero import App, PushButton, Text
import threading
import time
# Action you would like to perform
def counter0():
global s0
text0.value = int(text0.value) + 1 # works
text1.value = s0 # works
def run_command():
time.sleep(1) # originally a subprocess is called here; works
text1.value = "ready" # only diplays this after a delay
def counter1():
global s0
text1.value = "Running command..."
threading.Thread(target=run_command).start()
s0 = "start something after pressing butt1"
app = App("Hello world", layout="grid")
text0 = Text(app, text="1", align="left", grid=[0, 1])
text1 = Text(app, text=s0, align="left", grid=[0, 8])
butt1 = PushButton(app, text="Button", command=counter1,
align="left", grid=[0, 2])
text0.repeat(10000, counter0)
app.display()
运行使用上面的代码会给你以下行为: