У меня есть окно с вводом для QR-кодов. Идея состоит в том, что пользователь будет считывать QR-код с помощью QR-сканера, Entry переключается только на чтение, чтобы избежать повторного ввода от пользователя, пока приложение выполняет некоторую обработку. После завершения запись снова доступна для редактирования, и пользователь может прочитать другой QR-код.
Я создал переменную status
, которая контролирует, когда запись входа будет доступна только для чтения или нет, она отлично работает, когда пользователь читает QR Код и еще, и еще.
Проблема в том, что когда я пытаюсь показать сообщение, когда пользователь нажимает клавишу ВВОД, а QR-код пуст, или когда пользователь последовательно читает один и тот же QR-код. Сообщение отображается, но запись остается доступной для редактирования. В реальном коде в этой ситуации открываются различные сообщения windows.
Вот мой код:
import tkinter as tk
from tkinter import ttk
from tkinter import *
def main():
root = Tk()
root.title("Test")
root.geometry("850x140+10+450")
root.resizable(0,0)
MyFrame()
root.mainloop()
class MyFrame(Frame):
def __init__(self):
super().__init__()
self.qrcode = StringVar()
self.qrcodeEntry = None
self.lastQrcode = ""
# Status da tela
# 0 - Enabled
# 1 - Disable (Processing)
self.status=0
self.initUI()
def initUI(self):
self.status=0
root = self.master
mainframe = ttk.Frame(root, padding="3 3 12 12")
mainframe.grid(column=0, row=0, sticky=(N, W, E, S))
root.columnconfigure(0, weight=1)
root.rowconfigure(0, weight=1)
self.qrcodeEntry = ttk.Entry(mainframe, width=20, textvariable=self.qrcode)
self.qrcodeEntry.grid(column=2, row=1, sticky=(W, E))
self.qrcodeEntry.focus()
root.bind('<Return>', self.execute)
def execute(self, *argss):
#This call is not working
self.qrcodeEntry.configure(state='readonly')
# Executes if status is 0
if self.status == 1:
return
# Reset Status
self.status=1
# Check if QR is empty
if (not self.qrcode.get()):
self.showCriticalError("Message", "QR is empty")
return
# Check if QR is equals last QR
if (self.qrcode.get()==self.lastQrcode):
self.update_idletasks()
self.showCriticalError("Message", "QR is the same")
# DO SOMETHING
# Makes lastQrCode equals current QR
self.lastQrcode = self.qrcode.get()
self.master.after(3000, self.clear)
def clear(self):
self.status=0
self.qrcodeEntry.configure(state='normal')
self.qrcode.set('')
self.master.lift()
self.qrcodeEntry.focus()
def showCriticalError(self, title, message):
self.master.lift()
top = Toplevel(self.master)
top.grab_set()
top.title(title)
top.geometry("650x240+10+10")
top.resizable(0,0)
top.transient(self.master)
rows = 0
while rows < 10:
top.rowconfigure(rows, weight=1)
top.columnconfigure(rows, weight=1)
rows += 1
Message(top, text=message, width = 500).grid(row=0,column=2, rowspan=8, columnspan=7,sticky='W')
okButton = Button(top, text ="OK", command = top.destroy, width = 10)
okButton.grid(row=9,column=4, columnspan=2)
top.after(7000, top.destroy)
self.clear()
if __name__ == '__main__':
main()