Чтение нажатий клавиш и размещение в текстовом поле - PullRequest
0 голосов
/ 30 апреля 2018

Я учитель, который пишет программу для считывания 8-значного идентификационного штрих-кода для учащихся, которые опаздывают в школу. Я опытный программист, но плохо знаком с 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()

введите описание изображения здесь

1 Ответ

0 голосов
/ 30 апреля 2018

Вы делаете некоторые необычные вещи, чтобы поместить текст в поле ввода на основе нажатий клавиш. Я изменил ваш код, чтобы он устанавливал фокус на виджете «Ввод» и проверял содержимое поля «Ввод» каждый раз, когда нажимается клавиша (пока фокус ввода находится в фокусе). Затем я получаю содержимое поля Entry и проверяю, меньше ли длина 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()
...