Среда: macOS Catalina, Python 3.7.4, Tcl / Tk 8.6.9, VSC 1.39.1
У меня есть ситуация, когда я использую сканер штрих-кода / QR-кодапредоставить строку для метода ttk.Entry (), который затем запускает функцию.
Оператор видит читателя как HID-клавиатуру, поэтому ttk получает текст из QR-кода. Виджет .Entry (), которому я уделяю внимание при выполнении кода. Я связал виджет с ключом, потому что сканер отправляет cr / lf в конце текстовой строки, которая работает по мере необходимости.
Однако я сталкиваюсь с проблемой, когда код qr задерживаетсяслишком долго сканер будет повторно сканировать код qr, и виджет снова получит текст кода qr, что затем приведет к его повторной обработке.
Я попытался отключить функцию ttk.Entry (), удаливсодержимое виджета и удаление фокуса безрезультатно. Поведение, которое я вижу, происходит, даже если виджет отключен и не имеет фокуса, он все еще получает ввод и снова выполняет функцию, если сканер повторно сканирует код qr во время выполнения функции.
InВ этом первом примере я просто попытался отключить виджет, но это не сработало. Виджет по-прежнему получает более поздние сканы, находясь в функции.
# test-ttk-entry1.py
import time
import tkinter as tk
from tkinter import StringVar, ttk
root = tk.Tk()
def print_text(event):
global kbEntry
textValue = kbEntry.get()
kbEntry.configure(state="disabled")
time.sleep(2) # Add in a delay to allow for repeat scan
print(textValue)
time.sleep(2) # Add in a delay to allow for repeat scan
kbEntry.configure(state="active")
kbText = StringVar()
kbEntry = ttk.Entry(root, width=10, textvariable=kbText)
kbEntry.bind("<Return>", print_text)
kbEntry.pack()
kbEntry.focus_set()
root.mainloop()
Вторая попытка состояла в том, чтобы отключить виджет ввода и после его активации снова удалить текст в поле.
# test-ttk-entry2.py
import time
import tkinter as tk
from tkinter import END, StringVar, ttk
root = tk.Tk()
def print_text(event):
global kbEntry
textValue = kbEntry.get()
kbEntry.delete(0, END)
kbEntry.configure(state="disabled")
time.sleep(2) # Add in a delay to allow for repeat scan
print(textValue)
time.sleep(2) # Add in a delay to allow for repeat scan
kbEntry.configure(state="active")
kbEntry.delete(0, END)
kbText = StringVar()
kbEntry = ttk.Entry(root, width=10, textvariable=kbText)
kbEntry.bind("<Return>", print_text)
kbEntry.pack()
kbEntry.focus_set()
root.mainloop()
И, наконец, я читал о том, как сфокусироваться на виджете и уделить внимание корневому окну, поэтому я добавил, что он все равно несколько раз печатает на консоль, как если бы ttk.Entry читал буфер клавиатуры. ) виджет. Странно то, что виджеты обычно не реагируют на любые вызовы методов, когда они отключены, но, похоже, свойства / атрибуты виджета ttk.Entry () (извините, если мои термины ООП не верны) могут быть измененыпока отключено.
# test-ttk-entry2.py
import time
import tkinter as tk
from tkinter import END, StringVar, ttk
root = tk.Tk()
def print_text(event):
global kbEntry
textValue = kbEntry.get()
kbEntry.delete(0, END)
kbEntry.configure(state="disabled")
root.focus_set()
time.sleep(2) # Add in a delay to allow for repeat scan
print(textValue)
time.sleep(2) # Add in a delay to allow for repeat scan
kbEntry.configure(state="active")
kbEntry.delete(0, END)
kbEntry.focus_set()
kbText = StringVar()
kbEntry = ttk.Entry(root, width=10, textvariable=kbText)
kbEntry.bind("<Return>", print_text)
kbEntry.pack()
kbEntry.focus_set()
root.mainloop()
Итак, как я могу запретить виджету ttk.Entry () принимать любые вводы с устройства HID / клавиатуры во время выполнения моей функции?