остановить ttk.Entry () от чтения с клавиатуры - PullRequest
0 голосов
/ 15 октября 2019

Среда: 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 / клавиатуры во время выполнения моей функции?

1 Ответ

0 голосов
/ 16 октября 2019

Так как я не могу найти способ временно отключить виджет .Entry () программно, чтобы он не мог читать последовательные входные данные, я пришел к такому решению:

# test-ttk-entry2.py

import time
import tkinter as tk
from tkinter import END, StringVar, ttk

root = tk.Tk()
tempStr = "" # Global temporary string variable to trip repeated scans

def print_text(event):

    global tempStr

    textValue = kbEntry.get()
    if tempStr == textValue:
        kbEntry.delete(0, END)
        print ("Duplicate scan")
        return
    tempStr = textValue
    kbEntry.delete(0, END)
    print(textValue)
    time.sleep(3) # Simulate the time it takes for the function to complete

kbEntry = ttk.Entry(root, width=10)
kbEntry.bind("<Return>", print_text)
kbEntry.grid(row=0, column=0, padx=10, pady=10)
kbEntry.focus_set()

root.mainloop()
...