Tkinter: установка записи только для чтения не работает - PullRequest
0 голосов
/ 19 июня 2020

У меня есть окно с вводом для 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()

Ответы [ 2 ]

0 голосов
/ 24 июня 2020

Проблема была в последней строке метода showCriticalError: self.clear() эта строка возвращала запись в нормальное состояние. Поэтому я удалил эту строку и изменил top.after(7000, top.destroy) на top.after(7000, lambda: self.clear() or top.destroy() ), и я сделал то же самое в команде okButton

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 = lambda: self.clear() or top.destroy(), width = 10)
        okButton.grid(row=9,column=4, columnspan=2)
        top.after(7000, lambda: self.clear() or top.destroy() )


if __name__ == '__main__':
    main()
0 голосов
/ 19 июня 2020

Вы отключаете запись внутри функции execute(). Вы должны это назвать.

Вот что я думаю вам нужно:

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().execute()
    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='disabled')

        # 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...