- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试制作一个 GUI,以使测试台更加用户友好,但他们请求了一个停止按钮,该按钮将结束当前程序而不杀死实际的 GUI 窗口。
我知道线程可能是执行此操作的方法,因为当按下“开始”按钮时,它会接管整个 GUI 窗口,并且无法单击任何内容,但我不确定如何在我的代码中实际实现它。
我希望能够按下停止按钮并使 GPIO 返回到关闭状态,然后能够再次按下启动按钮并让程序再次从头开始。
import tkinter as tk
import RPi.GPIO as GPIO
import time as time
from time import sleep
#sets GPIO pin numbers#
GPIO4 = 4
GPIO17 = 17
GPIO27 = 27
GPIO22 = 22
GPIO23 = 23
GPIO24 = 24
#sets the initial state of the start button#
Start_state = True
#sets GPIOs to GPIO pin numbers#
GPIO.setmode(GPIO.BCM)
#sets warnings to not show#
GPIO.setwarnings(False)
#sets up GPIOs as outputs#
GPIO.setup(GPIO4, GPIO.OUT)
GPIO.setup(GPIO17, GPIO.OUT)
GPIO.setup(GPIO27, GPIO.OUT)
GPIO.setup(GPIO22, GPIO.OUT)
GPIO.setup(GPIO23, GPIO.OUT)
GPIO.setup(GPIO24, GPIO.OUT)
#sets initial states of the pins#
GPIO.output(GPIO4, False)
GPIO.output(GPIO17, False)
GPIO.output(GPIO27, False)
GPIO.output(GPIO22, False)
GPIO.output(GPIO23, False)
GPIO.output(GPIO24, False)
#start of main.loop()#
try:
####sets GUI window####
master = tk.Tk()
####name of GUI####
master.title("SOLENOID CONTROL")
####sets size of window (widthxheight)####
master.geometry ("650x150")
####sets initial states of GPIOs to 'off'####
GPIO4_state = False
GPIO17_state = False
GPIO27_state = False
GPIO22_state = False
GPIO23_state = False
GPIO24_state = False
####defines checkbutton states and relates them to individual GPIOs####
def GPIO4button():
global GPIO4_state
GPIO4_state = not GPIO4_state
def GPIO17button():
global GPIO17_state
GPIO17_state = not GPIO17_state
def GPIO27button():
global GPIO27_state
GPIO27_state = not GPIO27_state
def GPIO22button():
global GPIO22_state
GPIO22_state = not GPIO22_state
def GPIO23button():
global GPIO23_state
GPIO23_state = not GPIO23_state
def GPIO24button():
global GPIO24_state
GPIO24_state = not GPIO24_state
####defines dwell, spray times, and number of repititions (runs) from entry boxes####
def dwell():
dwell = e1.get()
def spray():
spray = e2.get()
def runs():
runs = e3.get()
####defines the start buttons actions####
def Start():
########gets input from entry boxes to be used in while loop#########
dwell = int(e1.get())
print('dwell: ' + str(dwell))
if e1.get() == 0:
time.sleep(e1.get())
else:
pass
spray = int(e2.get())
print('spray: ' + str(spray))
if e2.get() == 0:
time.sleep(e2.get())
else:
pass
runs = int(e3.get())
print('runs: ' + str(runs))
if e3.get() == 0:
runs = e3.get()
else:
pass
########defines the start buttons state and sets i = 0 for the 'runs' counter########
global Start_state
i = 0
########when the button is pushed do:########
if Start_state == True:
############starts loop for 'runs' counter############
while i < runs:
################prints states of GPIOs and sets state based on checkbutton input, sets dwell and spray time based on entry box input, runs sequentially################
print('gpio4: ' + str(GPIO4_state))
if GPIO4_state == True:
GPIO.output(GPIO4, True)
time.sleep(spray)
GPIO.output(GPIO4, False)
Start_state == False
time.sleep(dwell)
print('gpio17: ' + str(GPIO17_state))
if GPIO17_state == True:
GPIO.output(GPIO17, True)
time.sleep(spray)
GPIO.output(GPIO17, False)
Start_state == False
time.sleep(dwell)
print('gpio27: ' + str(GPIO27_state))
if GPIO27_state == True:
GPIO.output(GPIO27, True)
time.sleep(spray)
GPIO.output(GPIO27, False)
Start_state == False
time.sleep(dwell)
print('gpio22: ' + str(GPIO22_state))
if GPIO22_state == True:
GPIO.output(GPIO22, True)
time.sleep(spray)
GPIO.output(GPIO22, False)
Start_state == False
time.sleep(dwell)
print('gpio23: ' + str(GPIO23_state))
if GPIO23_state == True:
GPIO.output(GPIO23, True)
time.sleep(spray)
GPIO.output(GPIO23, False)
Start_state == False
time.sleep(dwell)
print('gpio24: ' + str(GPIO24_state))
if GPIO24_state == True:
GPIO.output(GPIO24, True)
time.sleep(spray)
GPIO.output(GPIO24, False)
Start_state == False
time.sleep(dwell)
else:
pass
################prints end of run + run number for east debug################
print('end: ' + str(i))
################adds 1 to the 'runs' to reach entry box value################
i += 1
############end of while loop############
else:
pass
####creates checkbutton and links it to button command####
####positions checkbutton in GUI window####
checkbutton1 = tk.Checkbutton(master, text="1", command=GPIO4button)
checkbutton1.grid(row=1, column=1)
checkbutton2 = tk.Checkbutton(master, text="2", command=GPIO17button)
checkbutton2.grid(row=1, column=2)
checkbutton3 = tk.Checkbutton(master, text="3", command=GPIO27button)
checkbutton3.grid(row=1, column=3)
checkbutton4 = tk.Checkbutton(master, text="4", command=GPIO22button)
checkbutton4.grid(row=1, column=4)
checkbutton5 = tk.Checkbutton(master, text="5", command=GPIO23button)
checkbutton5.grid(row=1, column=5)
checkbutton6 = tk.Checkbutton(master, text="6", command=GPIO24button)
checkbutton6.grid(row=1, column=6)
####labels checkbutton rows####
tk.Label(master, text="SOLENOIDS").grid(row=1, column=0)
####creates entry boxes and links them to entry variable####
####positions entry boxes in GUI window####
tk.Label(master, text="DWELL TIME").grid(row=6,column=7)
e1 = tk.Entry(master)
e1.grid(row=6, column=8)
tk.Label(master, text="SPRAY TIME").grid(row=7,column=7)
e2 = tk.Entry(master)
e2.grid(row=7, column=8)
tk.Label(master, text="RUNS").grid(row=8,column=7)
e3 = tk.Entry(master)
e3.grid(row=8, column=8)
####creates start, stop, and exit buttons and links them to respective commands####
####starts while loop####
Startbutton = tk.Button(master, text="START", bg="green", command=Start)
Startbutton.grid(row=10, column=7)
####stops current 'run'####
Stopbutton = tk.Button(master, text="STOP", bg="red", command=Start)
Stopbutton.grid(row=10, column=8)
####exits GUI window####
Exitbutton = tk.Button(master, text="EXIT", bg="red", command=master.destroy)
Exitbutton.grid(row=10, column=9)
####still no real idea####
master.mainloop()
#sets all GPIO back to original 'off' state#
finally:
GPIO.cleanup()
我希望能够按下停止按钮并使 GPIO 返回到关闭状态,然后能够再次按下启动按钮并让程序再次从头开始。
最佳答案
如果您启动长时间运行的函数,那么您必须在线程中运行它,但它可能无法访问 GUI。
如果您可以将函数拆分为更小的部分,那么您可以使用 master.after(time, next_part)
运行下一部分,然后 mainloop()
有时间更新GUI - 即。它有时间运行分配给“停止”按钮的功能 - 并且不会卡住。可以使用 master.after()
代替 sleep()
。
或者您可以在函数中的许多地方使用 master.update()
,这样它将更新 GUI - mainloop()
将有时间运行分配给 STOP 的函数按钮。它不需要线程。
要结束程序,您可以在很多地方使用 bool 变量(即if is_running:
)。按钮 STOP
应设置 is_running = False
,并且应在 if is_running:
上停止运行函数。
关于python - 如何创建一个按钮来结束程序而不结束GUI?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56872022/
前言: 有时候,一个数据库有多个帐号,包括数据库管理员,开发人员,运维支撑人员等,可能有很多帐号都有比较大的权限,例如DDL操作权限(创建,修改,删除存储过程,创建,修改,删除表等),账户多了,管理
所以我用 Create React App 创建并设置了一个大型 React 应用程序。最近我们开始使用 Storybook 来处理和创建组件。它很棒。但是,当我们尝试运行或构建应用程序时,我们不断遇
遵循我正在创建的控件的代码片段。这个控件用在不同的地方,变量也不同。 我正在尝试编写指令来清理代码,但在 {{}} 附近插入值时出现解析错误。 刚接触 Angular ,无法确定我错过了什么。请帮忙。
我正在尝试创建一个 image/jpeg jax-rs 提供程序类,它为我的基于 post rest 的 Web 服务创建一个图像。我无法制定请求来测试以下内容,最简单的测试方法是什么? @POST
我一直在 Windows 10 的模拟器中练习 c。后来我改用dev C++ IDE。当我在 C 中使用 FILE 时。创建的文件的名称为 test.txt ,而我给出了其他名称。请帮助解决它。 下面
当我们创建自定义 View 时,我们将 View 文件的所有者设置为自定义类,并使用 initWithFrame 或 initWithCode 对其进行实例化。 当我们创建 customUITable
我正在尝试为函数 * Producer 创建一个线程,但用于创建线程的行显示错误。我为这句话加了星标,但我无法弄清楚它出了什么问题...... #include #include #include
今天在做项目时,遇到了需要创建JavaScript对象的情况。所以Bing了一篇老外写的关于3种创建JavaScript对象的文章,看后跟着打了一遍代码。感觉方法挺好的,在这里与大家分享一下。 &
我正在阅读将查询字符串传递给 Amazon 的 S3 以进行身份验证的文档,但似乎无法理解 StringToSign 的创建和使用方式。我正在寻找一个具体示例来说明 (1) 如何构造 String
前言:我对 C# 中任务的底层实现不太了解,只了解它们的用法。为我在下面屠宰的任何东西道歉: 对于“我怎样才能开始一项任务但不等待它?”这个问题,我找不到一个好的答案。在 C# 中。更具体地说,即使任
我有一个由一些复杂的表达式生成的 ILookup。假设这是按姓氏查找人。 (在我们简单的世界模型中,姓氏在家庭中是唯一的) ILookup families; 现在我有两个对如何构建感兴趣的查询。 首
我试图创建一个 MSI,其中包含 和 exe。在 WIX 中使用了捆绑选项。这样做时出错。有人可以帮我解决这个问题。下面是代码: 错误 error LGH
在 Yii 中,Create 和 Update 通常使用相同的形式。因此,如果我在创建期间有电子邮件、密码、...other_fields...等字段,但我不想在更新期间专门显示电子邮件和密码字段,但
上周我一直在努力创建一个给定一行和一列的 QModelIndex。 或者,我会满足于在已经存在的 QModelIndex 中更改 row() 的值。 任何帮助,将不胜感激。 编辑: QModelInd
出于某种原因,这不起作用: const char * str_reset_command = "\r\nReset"; const char * str_config_command = "\r\nC
现在,我有以下由 original.df %.% group_by(Category) %.% tally() %.% arrange(desc(n)) 创建的 data.frame。 DF 5),
在今天之前,我使用/etc/vim/vimrc来配置我的vim设置。今天,我想到了创建.vimrc文件。所以,我用 touch .vimrc cat /etc/vim/vimrc > .vimrc 所
我可以创建一个 MKAnnotation,还是只读的?我有坐标,但我发现使用 setCooperative 手动创建 MKAnnotation 并不容易。 想法? 最佳答案 MKAnnotation
在以下代码中,第一个日志语句按预期显示小数,但第二个日志语句记录 NULL。我做错了什么? NSDictionary *entry = [[NSDictionary alloc] initWithOb
我正在使用与此类似的代码动态添加到数组; $arrayF[$f+1][$y][$x+1] = $value+1; 但是我在错误报告中收到了这个: undefined offset :1 问题:尝试创
我是一名优秀的程序员,十分优秀!