【问题标题】:pynput listener crashes code when implementedpynput 侦听器在实现时崩溃代码
【发布时间】:2022-01-01 23:28:20
【问题描述】:

我对 python 很陌生,我不知道为什么,但是当我专门在 with Listener(on_press=press) as listener: listener.join() 当它崩溃时它不会给我一个错误消息
这是我的全部代码:

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()

我试图自己找出问题,但是当我将它导入另一个选项卡并使用多种不同的方法时,它仍然从未在这些测试中崩溃

请帮帮我

【问题讨论】:

  • 总是将完整的错误消息(从单词“Traceback”开始)作为文本(不是屏幕截图,不是指向外部门户的链接)(不是在 cmets 中)。还有其他有用的信息。
  • 有一个很好的规则是将所有classes 直接放在import 之后,然后是所有functions,然后是其余代码(从self = tk.Tk() 开始)。更多内容PEP 8 -- Style Guide for Python Code
  • 如果你想检查 if press 那么这是错误的,因为在你的代码中 press 是一个函数,而不是变量 - 你的 press() 应该为全局变量赋值,tkitner 应该检查这个全局变量 - 或者监听器应该运行 Keyreg.check 而不是 press
  • 我不明白你想用pyinput 做什么。如果您想在 tkinter 窗口中获取密钥,则可以使用 root.bind('<Key>', press)。或root.bind('<KeyPress>', press)root.bind('<KeyRelease>', press)

标签: python python-3.x


【解决方案1】:

您没有显示完整的错误消息,所以我不知道您的真正问题是什么,但我发现了一个问题。

代码

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

运行等待listener 结束的代码并停止其余代码

如果你想和tkinter同时运行它,那么你应该运行为

with Listener(on_press=press) as listener:

    tk.mainloop()

    listener.join()    

或更类似于threading(由listener使用)

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

tk.mainloop()

listener.join()    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-21
    • 1970-01-01
    • 1970-01-01
    • 2019-03-29
    • 2020-05-05
    • 2013-08-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多