代码之家  ›  专栏  ›  技术社区  ›  JWoods4

读取击键并放入文本框

  •  0
  • JWoods4  · 技术社区  · 6 年前

    我是一名教师,正在编写一个程序,为迟到的学生读取8位数的ID条形码。我是一名经验丰富的程序员,但对Python和Tkinter都是新手(大约36小时的经验),到目前为止,我已经大量使用了这个网站,但我无法找到这个问题的答案:

    如何准确读取8位数字,并立即在文本框中显示这8位数字。我能做到7,但似乎不能做到8。有时,我在文本框中什么也得不到。我使用了Entry、bind,所有功能都正常,只是我似乎无法在bind事件中读取按键,从而将按键一致地放在输入的文本框中。打印时ID似乎总是正确的,但文本框中的ID不正确。我似乎无法显示tkinter屏幕,所以在完成后,文本框中只显示7位数字或什么都不显示。

    下面是我的一段代码,它处理GUI

    from tkinter import *
    from collections import Counter
    import time
    i=0
    class studentNumGUI():
        def __init__(self, master):
            master.title("Student ID Reader")
            self.idScanned = StringVar()
            localTime = time.asctime(time.localtime(time.time()))
            self.lblTime = Label(master, text=localTime)
            self.lblTime.pack()
            self.lbl = Label(master, text="Enter Student ID:")
            self.lbl.pack()
            self.idScanned.set("")
            self.idScan = Entry(master,textvariable=self.idScanned,width=12)
            self.idScan.pack()
            self.frame=Frame(width=400,height=400)
            self.frame.pack()
            self.frame.focus()
            self.frame.bind('<Key>',self.key)
    
        def key(self,event):
            global i
            self.frame.focus()
            self.idScan.insert(END,event.char)
            print(repr(event.char)," was pressed") #just to make sure that my keystrokes are accepted
            if (i < 7):
                i += 1
            else:
                #put my other python function calls here once I fix my problem
                self.frame.after(2000)
                #self.idScan.delete(0,END) #Then go blank for the next ID to be read
                i=0
    
    root = Tk()
    nameGUI = studentNumGUI(root)
    root.mainloop()
    

    enter image description here

    1 回复  |  直到 6 年前
        1
  •  0
  •   scotty3785    6 年前

    您正在执行一些不寻常的操作,以便根据按键将文本放置在输入字段中。我已经更改了您的代码,以便它在条目小部件上设置焦点,并在每次按下键时检查条目字段的内容(而条目具有焦点)。然后获取输入字段的内容,并检查长度是否小于8。如果为8(或更大),则会清除方框。 这对你有什么作用? 我在注释掉的代码中留下了

    from tkinter import *
    from collections import Counter
    import time
    
    class studentNumGUI():
        def __init__(self, master):
            master.title("Student ID Reader")
            self.idScanned = StringVar()
            localTime = time.asctime(time.localtime(time.time()))
            self.lblTime = Label(master, text=localTime)
            self.lblTime.pack()
            self.lbl = Label(master, text="Enter Student ID:")
            self.lbl.pack()
            self.idScanned.set("")
            self.idScan = Entry(master,textvariable=self.idScanned,width=12)
            self.idScan.pack()
            self.idScan.focus_set()
            self.frame=Frame(width=400,height=400)
            self.frame.pack()
            #self.frame.focus()
            #self.frame.bind('<Key>',self.key)
            self.idScan.bind('<Key>',self.key)
    
        def key(self,event):
            #self.frame.focus()
            #self.idScan.insert(END,event.char)
            print(repr(event.char)," was pressed") #just to make sure that my keystrokes are accepted
            len(self.idScanned.get())
            if (len(self.idScanned.get())<8):
                pass
            else:
                #put my other python function calls here once I fix my problem
                self.idScan.delete(0,END) #Then go blank for the next ID to be read
                #self.frame.after(2000)
    
    
    root = Tk()
    nameGUI = studentNumGUI(root)
    root.mainloop()