これは私が苦労しているプログラムの2番目のバージョンです。私はプログラムの最初のバージョンで以前の質問を掲載しましたが、運はありませんでした。TKinterボタンでいつでもGPIO RPiループを中断する方法
ここでは、私がトラックから外れている場所を見つけるのに役立つ「大きな画像のアイデア」です。私は水にたくさんの植物を持っていますが、ラズベリーパイのタッチスクリーンに表示されるTKinterのGUIを作りたいと思います。 Piは、水ポンプに配線された110Vリレースイッチを制御します。 z#の植物の基本的な「オン/オフ」ループ。
ユーザーには、調整する3つのスライダーバー、X、Y、Zの値があります。 XはウォーターポンプをONにする必要がある時間、Yはウォーターポンプをどれぐらいオフにする必要があるか(したがって、ホースを次のプラントに物理的に移動させる時間がある)、Zは必要なプラントの総数水。私はいつもループを永遠に走らせていました。なぜなら私はいつもCTRL-Cを使ってプログラムを終了させることができたからです。しかし今はキーボードが不要なタッチスクリーン上で全部しようとしています。 Linuxが端末の使い方をどのように意味しているかを知る。 GUIのタッチスクリーンボタン(スマートフォンやタブレットのような)を見るのに慣れているプログラムのように実行する必要もあります。
コードはほとんどの場合うまく機能し、停止してクラッシュすることなく起動します。私はスタートボタンを見つけました。そして、ゼロで値を開始したい場合にスライダーの値をクリアするリセットボタンがあります。しかし、ここにいる多くの人々に影響を与えていると思われる大きな問題は、frigginのEXITボタンです。
ループ中にいつでもTKinter EXITボタンを押して、ボタンが押されたときにプログラムに知らせて、すぐにループを中断することができるようにする必要があります。私は多くのことを試みましたが、何も動作しません。チェックボタンは、ループが終了するまで待ってから、トグル値を更新します。その時点でそれは遅すぎます。私は給水ループ全体でユーザーコントロールが必要です。
EXITを押したときにプログラムを終了させたくないのではなく、GPIOループを "OFF"値で停止して基本的にプログラムを開始状態に戻したいとします。
私はtime.sleep()
が非常に粗いことを知っていますが、それ以外の方法はありません。私は人々が「糸を引く」ことについて話しているのを見たことがありますが、私はそれが何を意味しているのかわかりません。私はTKintersの "after()"関数についても人々が話しているのを見てきました。また、私は答えについて非常に明確な例が必要です。ちょうど "使用スレッド"はヘルプを提供していない - 私はノブです!
from tkinter import *
import RPi.GPIO as GPIO
import time
master = Tk()
def onoffcycle():
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.setup(14, GPIO.OUT)
GPIO.setup(14, GPIO.LOW)
y=off.get()
y=float(y)
x=on.get()
x=float(x)
GPIO.output(14, True)
print("On")+str(x)
time.sleep(x)
GPIO.output(14, False)
print("Off")+str(y)
time.sleep(y)
def start():
print("Prepare to water in 10 seconds...")
time.sleep(10)
z=cycle.get()
z=float(z)
while z > 0:
onoffcycle()
z=z-1
print("Cycles remaining:")+str(z)
###tog()
###if t==1:
###reset()
else:
reset()
### this program runs onoffcycle() for z number of cycles as set by the slider.
### It should check for an exit toggle, then run the program for one cycle,
### then check for exit, then another round. countdown from cycle.get variable
def reset():
GPIO.cleanup()
on.set(0)
off.set(0)
cycle.set(0)
t=IntVar()
###def tog():
### HELP! This is where I need the program to be looking for the EXIT button being pressed
### in order to stop the program. Everything I have tried so far waits until the z value drops
### to zero, basically until the program stops on its own. I need a button that interrupts
### everything.
on = Scale(master, label="Set # Seconds Water ON:", from_=0, to=180, orient=HORIZONTAL, length=400, width=35,
troughcolor="red", bg="SteelBlue1", fg="black", bd=6, sliderlength=90, sliderrelief=RIDGE,
font = '-weight bold')
on.grid(column=1, row=1, columnspan=3)
off = Scale(master, label="Set # Seconds Water OFF:", from_=0, to=30, orient=HORIZONTAL, length=400, width=35,
troughcolor="yellow", bg="SteelBlue1", fg="black", bd=6, sliderlength=90, sliderrelief=RIDGE,
font = '-weight bold')
off.grid(column=1, row=2, columnspan=3)
cycle = Scale(master, label="Set # of Plants to Water:", from_=0, to=200, orient=HORIZONTAL, length=400, width=35,
troughcolor="green", bg="SteelBlue1", fg="black", bd=6, sliderlength=90, sliderrelief=RIDGE,
font = '-weight bold')
cycle.grid(column=1, row=3, columnspan=3)
go = Button(master, text="START", command=start, bg="SteelBlue3", width=10, height=2, font='-weight bold')
go.grid(column=1, row=4)
adios = Checkbutton(master, text="EXIT", variable=t, indicatoron=0, bd=6, bg="SteelBlue3", width=11, height=2, font='-weight bold')
adios.grid(column=3, row=4)
###adios should have a command to run an exit program - with toggle values? or something else?
resetbutton = Button(master, text="RESET", command=reset, bg="SteelBlue3", width=10, height=2, font='-weight bold')
resetbutton.grid(column=2, row=4)
mainloop()
あなたは 'sleep()'と 'while'の代わりに' root.after(milliseconds、function_name) 'を使う必要があります。 '10s = 10000ms'つまり、' start() 'の最後の' root.after(10000、start) 'は10秒後にこの関数を再度実行しなければならず、' sleep() 'は必要なく、 whileを必要とするが、ifはafterを止める。 – furas
'print(" On ")+ str(x)'は 'None'を返すので意味がありません。' None + str(x) 'を実行します。 print( "On"、x) 'または少なくともprint(" On "+ str(x))'または 'print(" On {} "。最も単純です。 – furas
furas - 非常に多くの情報をありがとう! print()の部分は、ユーザが選択した値をコマンドラインで表示します。 TKinterのウィンドウを全画面にしたいので、実際にはユーザーが見ることを意図していないと思います。私はデバッグ中にそれを使っていましたが、最終的には役に立たないかもしれません。 – Stephen