pynput listener bloquea el código cuando se implementa

pynput listener bloquea el código cuando se implementa

Soy muy nuevo en python y no sé por qué, pero mi código sigue fallando cuando implemento el oyente específicamente en el with Listener(on_press=press) as listener: listener.join() y cuando falla no me da un mensaje de error
aquí está la totalidad de mi código:

import tkinter as tk
from tkinter.constants import LEFT, N, NE, NW, W
from PIL import Image, ImageTk
import tkinter.ttk as ttk
import time
from pynput.keyboard import Key, Controller
from pynput.keyboard import Listener
self = tk.Tk()
self.title('Key spammer')
self.iconbitmap("D:\Vs code repos\Key spammer\keyboard-icon.ico")

#Set the geometry of frame
self.geometry("350x550")
self.resizable(False, False)

#Button exit function
def exit_prog():
    exit()

def press(key):
    print(key)

#press interval
self.grid_rowconfigure(20, weight=1)
self.grid_columnconfigure(20, weight=1)

labelframe = ttk.Labelframe(self,text= "Press interval")
labelframe.grid(row=1, column=0, padx= 25, sticky=N)

class Lotfi(ttk.Entry):
    def __init__(self, master=None, **kwargs):
        self.var = tk.StringVar()
        ttk.Entry.__init__(self, master, textvariable=self.var, **kwargs)
        self.old_value = ''
        self.var.trace('w', self.check)
        self.get, self.set = self.var.get, self.var.set

    def check(self, *args):
        if self.get().isdigit(): 
            # the current value is only digits; allow this
            self.old_value = self.get()
        else:
            # there's non-digit characters in the input; reject this 
            self.set(self.old_value)

#Entry interval
hoursentry = Lotfi(labelframe, width= 10)
hoursentry.grid(row=1, column=1, padx= 5, pady= 10)
hoursentry.insert(0, '0')
hourslabel = ttk.Label(labelframe, text= "hours")
hourslabel.grid(row=1, column=2)
minutesentry = Lotfi(labelframe, width= 10)
minutesentry.grid(row=1, column=3)
minutesentry.insert(0, '0')
minuteslabel = ttk.Label(labelframe, text= "mins")
minuteslabel.grid(row=1, column=4)
secondsentry = Lotfi(labelframe, width= 10)
secondsentry.grid(row=1, column=5)
secondsentry.insert(0, '0')
secondeslabel = ttk.Label(labelframe, text= "secs")
secondeslabel.grid(row=1, column=6)

labelframekey = ttk.Labelframe(self,text= "Key options")
labelframekey.grid(row=2, column=0, padx= 25, pady= 25, sticky=NW)
#labelframekey.pack(side= LEFT)

keypress = ttk.Label(labelframekey, text= "Key pressed", font= 10)
keypress.grid(row=2, column=0, sticky= N)

with Listener(on_press=press) as listener:
    listener.join()    
class Keyreg(ttk.Entry):
    def __init__(self, master=None, **kwargs):
        self.var = tk.StringVar()
        ttk.Entry.__init__(self, master, textvariable=self.var, **kwargs)
        self.old_value = ''
        self.var.trace('w', self.check)
        self.get, self.set = self.var.get, self.var.set

    def check(self, *args):
        if press: 
            self.set(self.old_value)

#Keyreg = Keyreg(labelframekey, width= 10)
#keyreg.grid(row=2, column=1, sticky= N)
'''
#Creation of Option buttons
button = ttk.Button(self, text = 'Exit', command = exit_prog, width = 25)
button.grid(row=2, column=1,padx= 5, ipadx=15, ipady=10)
button2 = ttk.Button(self, text = 'Exit', command = exit_prog, width = 25)
button2.grid(row=2, column=2, ipadx=15, ipady=10)
button3 = ttk.Button(self, text = 'Exit', command = exit_prog, width = 25)
button3.grid(row=3, column=1, ipadx=15, ipady=10)
button4 = ttk.Button(self, text = 'Exit', command = exit_prog, width = 25)
button4.grid(row=3, column=2, ipadx=15, ipady=10)
'''
#Top menu for keybinds

tk.mainloop()

Traté de resolver el problema yo mismo, pero cuando lo importé a otra pestaña y usé varios métodos diferentes, nunca falló en esas pruebas

Por favor ayúdame

Mostrar la mejor respuesta

siempre ponga el mensaje de error completo (que comienza con la palabra "Traceback") en cuestión (no en los comentarios) como texto (no captura de pantalla, no enlace a portal externo). Hay otra información útil.

hay una buena regla para poner todo classes directamente después de import y luego todo functions, y luego el resto del código (comenzando en self = tk.Tk()) . Más información en PEP 8 -- Guía de estilo para código Python

si desea verificar if press, entonces está mal porque en su código press es una función, no una variable; su press() debería asignar valor a la variable global y tkitner debería verificar esta variable global, o tal vez el oyente debería ejecutar Keyreg.check en lugar de press

No entiendo qué quieres hacer con pyinput. Si desea obtener la clave en la ventana de tkinter, puede usar root.bind('<Key>', press). O root.bind('<KeyPress>', press) root.bind('<KeyRelease>', press)

No mostró el mensaje de error completo, así que no sé cuál es su problema real, pero veo un problema.

Código

with Listener(on_press=press) as listener:
    listener.join()    

ejecuta código que espera el final de listener y detiene el resto del código

si desea ejecutarlo al mismo tiempo que tkinter, debe ejecutarlo como

with Listener(on_press=press) as listener:

    tk.mainloop()

    listener.join()    

o más similar a threading (que es utilizado por listener)

listener = Listener(on_press=press)
listener.start()

tk.mainloop()

listener.join()