2017-01-04 5 views
0

助けてください!私はここで私の知恵が終わりました...私はPythonとtkinterを学ぶのが初めてで、私のことをしようとする人は見つけられていないので、私は別の人の答えを試し続け、何も動いていません。私はドキュメントを理解することができず、私が見つけるすべてのチュートリアルは、私がする必要があるものではないので、無関係のコードビットで終わるだけで、より多くの問題につながります。Tkinterフォーカスが機能しない - フォーカスに基づいて2つの異なる項目を入力するためにボタンのキーパッドが必要

ラズベリーパイのタッチスクリーンプログラムのGUIを構築して、リレーを「x」秒間オンにしてから「y」秒後にオフにしてから、停止するまで永遠に繰り返すようにプログラミングしたいそれ。タッチスクリーンには、数字0〜9のそれぞれに大きなボタンが必要です。値をクリアするボタン、入力ボックスに入力した各値を確認するボタン、サイクルを開始するボタン、終了ボタン。 「On」と「Off」の2つの入力ボックスが必要であり、ユーザーは各値に対して入力した数字を見ることができます。これが私を台無しにしているのです。私は1つの入力ボックスでは動作させることができますが、2つではありません。

誰かが間違っていると教えてください。フォーカスがある入力フィールドにのみ各値を配置するように各ボタンに指示する方法はわかりません。フォーカスがあるかどうかにかかわらず、1つのエントリまたは他のエントリに入力する方法を理解することしかできません。

「3」を入力した後に「0」を入力すると、プログラムは「30」と表示されるように、正しい入力順序で入力ボックスに数字を表示する必要もあります。今は "03"を生産しています。

ここにコードがあります。私は現在コメントアウトいくつかのものを持っている、とはい、私はそれが醜いことを知っている:

#!/usr/bin/env python 

    try: 
     # for Python 2 
     from Tkinter import * 
    except ImportError: 
     # for Python 3 
     from tkinter import * 

    import ttk as ttk 
    import RPi.GPIO as GPIO 
    import time 
    GPIO.setwarnings(False) 
    GPIO.setmode(GPIO.BCM) 
    GPIO.setup(4, GPIO.OUT) 
    GPIO.setup(4, GPIO.LOW) 

    running = True 


    def water(): 
     go.grid(column=4, row=3, rowspan=6, columnspan=6, sticky=W) 

    def go(): 
     running = True  
     x = on.get() 
     y = off.get() 
     y = float(y) 
     x = float(x)   
     if running: 
      GPIO.output(4, False) 
      print("Off") 
      time.sleep(y) 
      GPIO.output(4, True) 
      print("On") 
      time.sleep(x)  
      root.after(10, go)  

    def clear(): 
     on.set('') 
     off.set('') 
     global running 
     running = False 
     go.grid_forget() 
     on_entry.focus() 

    def select(value): 
     if on_entry.focus(): 
      on_entry.set(value) 
     elif off_entry.focus(): 
      off_entry.set(value) 

    def geton(): 
     on_entry.get() 
     off_entry.focus() 

    def getoff(): 
     off_entry.get() 
     water() 

    #this is the PROBLEM!!!! 
    def set_text(text): 
     on_entry.insert(0,text) 


    #buttons = ['1','2','3','4','5','6','7','8','9','0']  
    #varRow = 5 
    #varColumn = 0 

    root = Tk() 
    root.geometry("740x480+0+0") 
    root.title("Waterboy") 

    #need to make this fullscreen 
    mainframe = Frame(root) 
    mainframe.grid(column=0, row=0, sticky=(N, W, E, S)) 
    mainframe.columnconfigure(0, weight=1) 
    mainframe.rowconfigure(0, weight=1) 

    go = Button(mainframe, text="GO", command=go, bg="green", width=6, height=11) 

    #seconds on and off 
    on = StringVar() 
    off = StringVar() 

    on_entry = Entry(mainframe, width=8, textvariable=on) 
    on_entry.grid(column=2, row=1, sticky=(W, E)) 
    off_entry = Entry(mainframe, width=8, textvariable=off) 
    off_entry.grid(column=2, row=2, sticky=(W, E)) 


    on_entry.focus_set() 

    onok = Button(mainframe, text="OK", command=geton, bg="white", width=6, height=1) 
    onok.grid(column=4, row=1, sticky=W) 

    offok = Button(mainframe, text="OK", command=getoff, bg="white", width=6, height=1) 
    offok.grid(column=4, row=2, sticky=W) 

    reset = Button(mainframe, text="Reset Values", command=clear, bg='yellow', width=16, height=2) 
    reset.grid(column=0, row=7, sticky=W) 

    adios = Button(mainframe, text="EXIT", command=exit, bg="red", width=16, height=2) 
    adios.grid(column=2, row=7, sticky=W) 

    secon = ttk.Label(mainframe, text="Input # Seconds Water ON and press 'OK' -->", width=36) 
    secon.grid(column=0, row=1, columnspan=2) 
    secoff = ttk.Label(mainframe, text="Input # Seconds Water OFF and press 'OK' -->", width=36) 
    secoff.grid(column=0, row=2, columnspan=2) 

    one = Button(mainframe, text="1", width=16, height=2, command=lambda:set_text("1") 
    one.grid(column=0, row=4, sticky=W) 
    two = Button(mainframe, text="2", width=16, height=2, command=lambda:set_text("2") 
    two.grid(column=1, row=4, sticky=W) 
    three = Button(mainframe, text="3", width=16, height=2, command=lambda:set_text("3") 
    three.grid(column=2, row=4, sticky=W) 
    four = Button(mainframe, text="4", width=16, height=2, command=lambda:set_text("4") 
    four.grid(column=0, row=5, sticky=W) 
    five = Button(mainframe, text="5", width=16, height=2, command=lambda:set_text("5") 
    five.grid(column=1, row=5, sticky=W) 
    six = Button(mainframe, text="6", width=16, height=2, command=lambda:set_text("6") 
    six.grid(column=2, row=5, sticky=W) 
    seven = Button(mainframe, text="7", width=16, height=2, command=lambda:set_text("7") 
    seven.grid(column=0, row=6, sticky=W) 
    eight = Button(mainframe, text="8", width=16, height=2, command=lambda:set_text("8") 
    eight.grid(column=1, row=6, sticky=W) 
    nine = Button(mainframe, text="9", width=16, height=2, command=lambda:set_text("9") 
    nine.grid(column=2, row=6, sticky=W) 
    zero = Button(mainframe, text="0", width=16, height=2, command=lambda:set_text("0") 
    zero.grid(column=1, row=7, sticky=W) 


    #for child in mainframe.winfo_children(): child.grid_configure(padx=4, pady=4) 


    #root.bind('<Return>', go) 

    #for button in buttons: 
    # command = lambda x=button: select(x) 
    # Button(mainframe, text=button, width=5, bg="white", command = command).grid(row = varRow, column=varColumn) 
    # varColumn += 1 
    # if varColumn > 2 and varRow == 4: 
    #  varColumn = 0 
    #  varRow += 1 
    # if varColumn > 2 and varRow == 5: 
    #  varColumn = 0 
    #  varRow += 1 
    # if varColumn > 2 and varRow == 6: 
    #  varColumn = 0 
    #  varRow += 1 

    root.mainloop() 

答えて

0

あなたがフォーカスを持つウィジェットを取得するには、ルートウィンドウ上の方法focus_getを使用することができます。そのウィジェットを使用してテキストを挿入することができます。特別な索引 "end"を指定して、ウィジェットの最後にテキストを挿入することができます。例えば

:もちろん

def set_text(text) 
    widget = root.focus_get() 
    widget.insert("end", text) 

、あなたは、ウィジェットがテキストまたはエントリウィジェットであることを確認するために、いくつかの検証を行うことになるでしょう。

また、ttkの使用には注意が必要です.ttkボタンウィジェットのデフォルトの動作は、キーボードのフォーカスを奪うことです。

+0

応答のおかげで、これは本当に助けにはなりませんでした。私は仕事をして、エントリーボックスを完全に避けて、桁をスライドさせるために番号ボタンを使い果たしました。今私の問題は、プログラムがループ中に見て終了ボタンを作ることです。私はすぐに新しい質問を投稿します。 – Stephen

関連する問題