Tkinter Focus不工作 - 需要按钮键盘根据焦点键入2个不同的条目

时间:2017-01-04 21:36:56

标签: python linux tkinter raspberry-pi focus

请帮忙!我在这里的智慧结束了......我是学习Python和tkinter的新手,我没有找到任何人试图做我自己的事情,所以我一直在尝试不同的人的答案,没有任何工作。我无法理解文档,我找到的每个教程都不是我需要做的,所以我最终得到了不相关的代码,这些代码只会导致更多的问题。

我想构建一个用于Raspberry Pi的触摸屏程序的GUI,这将允许我编写一个继电器来打开" x"秒,然后关闭" y"秒,然后永远重复,直到我停止它。触摸屏需要为每个数字0 - 9设置大按钮,清除值的按钮,在输入框中输入后确认每个值的按钮,启动循环的按钮,以及退出的按钮。还需要有2个输入框,一个用于" On"和一个用于" Off",以便用户可以看到他们为每个值输入的数字。这就是搞砸我的原因。我可以让它在一个输入框中工作,但不能两个。

请有人告诉我有什么问题。我不知道如何告诉每个按钮只将其值放在具有焦点的输入字段中。我只能弄清楚如何告诉它在一个条目或另一个条目中输入,无论哪个具有焦点。

我还需要以正确的顺序在输入框中显示数字,以便在键入" 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()

1 个答案:

答案 0 :(得分:0)

您可以使用根窗口上的方法focus_get来获取具有焦点的窗口小部件。然后,您可以使用该小部件插入文本。您可以指定“end”的特殊索引,以便在窗口小部件的末尾插入文本。

例如:

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

当然,您需要进行一些验证,以确保窗口小部件是文本或条目窗口小部件。

另外,小心使用ttk - ttk按钮小部件的默认行为是窃取键盘焦点。