Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Events 读取击键并放入文本框_Events_Tkinter_Textbox_Bind - Fatal编程技术网

Events 读取击键并放入文本框

Events 读取击键并放入文本框,events,tkinter,textbox,bind,Events,Tkinter,Textbox,Bind,我是一名教师,正在编写一个程序,为上学迟到的学生读取8位ID条形码。我是一名经验丰富的程序员,但对Python和Tkinter都是新手(大约36小时的经验)。到目前为止,我大量使用了这个网站,但我无法找到这个问题的答案: 如何准确读取8位数字,并立即在文本框中显示这8位数字。我能做到7,但似乎不能做到8。有时,我在文本框中什么也得不到。我使用了Entry、bind,一切都正常,只是我似乎无法在bind事件中读取键,从而将输入的键一致地放在文本框中。当我打印ID时,它似乎总是正确的,但在文本框中它

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

如何准确读取8位数字,并立即在文本框中显示这8位数字。我能做到7,但似乎不能做到8。有时,我在文本框中什么也得不到。我使用了Entry、bind,一切都正常,只是我似乎无法在bind事件中读取键,从而将输入的键一致地放在文本框中。当我打印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()
从tkinter导入*
从收款进口柜台
导入时间
i=0
类studentNumGUI():
定义初始(自我,主):
硕士头衔(“学生ID阅读器”)
self.idScanned=StringVar()
localTime=time.asctime(time.localTime(time.time()))
self.lblTime=标签(主控,文本=本地时间)
self.lblTime.pack()
self.lbl=标签(master,text=“输入学生ID:”)
self.lbl.pack()
self.idScanned.set(“”)
self.idScan=Entry(master,textvariable=self.idScan,width=12)
self.idScan.pack()
自身框架=框架(宽度=400,高度=400)
self.frame.pack()
self.frame.focus()
self.frame.bind(“”,self.key)
def键(自身、事件):
全球i
self.frame.focus()
self.idScan.insert(END,event.char)
打印(repr(event.char),“被按下”)#只是为了确保我的击键被接受
如果(i<7):
i+=1
其他:
#解决问题后,将我的其他python函数调用放在这里
自我框架之后(2000年)
#self.idScan.delete(0,END)#然后为空以读取下一个ID
i=0
root=Tk()
nameGUI=studentNumGUI(根)
root.mainloop()

您正在做一些不寻常的事情,以便根据按键在输入字段中放置文本。我已经更改了您的代码,以便它在条目小部件上设置焦点,并在每次按下一个键时(当条目具有焦点时)检查条目字段的内容。然后获取输入字段的内容,并检查长度是否小于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()
从tkinter导入*
从收款进口柜台
导入时间
类studentNumGUI():
定义初始(自我,主):
硕士头衔(“学生ID阅读器”)
self.idScanned=StringVar()
localTime=time.asctime(time.localTime(time.time()))
self.lblTime=标签(主控,文本=本地时间)
self.lblTime.pack()
self.lbl=标签(master,text=“输入学生ID:”)
self.lbl.pack()
self.idScanned.set(“”)
self.idScan=Entry(master,textvariable=self.idScan,width=12)
self.idScan.pack()
self.idScan.focus\u set()
自身框架=框架(宽度=400,高度=400)
self.frame.pack()
#self.frame.focus()
#self.frame.bind(“”,self.key)
self.idScan.bind(“”,self.key)
def键(自身、事件):
#self.frame.focus()
#self.idScan.insert(END,event.char)
打印(repr(event.char),“被按下”)#只是为了确保我的击键被接受
len(self.idScanned.get())

if(len(self.idScanned.get())如果没有后端代码,任何人都很难进行调试barcode@ADWAN-您可以只在框架中键入一个8位数字,这同样有效。同样的问题也会发生。您所指的textbox小部件是什么?我不理解您在仅键入7位数字时说您做了您想做的事情,因为对我来说,无论我输入7位还是8位数字,都不会发生任何事情,我确实尝试过类似的方法,但我也希望代码在entrybox中显示8位数字的ID 2秒钟后消失。在输入新ID之前,它似乎会将ID保留在框中。你确实回答了我原来的问题,但我仍然在寻找这个新问题的答案e、 我仍在研究,但如果你有想法,我很乐意尝试。谢谢!@JWoods4这不是问题的一部分。你要么需要更新问题,要么创建一个新问题。想象一下,有人在你发送答案后更改了一个考试问题。Scotty,谢谢你的帮助。我的新问题带有你帮助我的新代码上一次,用户是否可以输入8位数字,在文本框中停留2秒钟,让我处理输入的8位数字,然后在输入下一组8位数字之前完全清除。到目前为止,我一直没有成功。我不是想更改试题,只是为了完成它,但现在意识到我没有这样做很好,再次感谢。