如何在Python中使击键自动完成?

2024-10-01 22:28:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在制作一个基于击键自动完成的函数。 比如,在google.com上,当我在搜索栏中点击“a”时,它会显示相关的搜索词,如amazon、amazon prime、airbnb。。。 我正在尝试使用Python和基于检测击键的CSV文件来实现这个函数。 CSV文件中有一些单词,如行为、建筑、化学、历史、制造、数学。 我的代码的结构包括

while # infinitely looping in order to keep detecting keystrokes
    for word in data 
        for char in range(numOfKeyStrokes)

问题是,当我点击“c”时,它应该打印出化学信息,而且效果很好。 但当我在已经点击“c”之后点击“h”时,没有反应。 我想再把这张“化学”打印出来。 我想当我点击“h”时,编译器不会进入“for word in data”语句,但我不知道为什么。 为了检测问题所在,存在一些垃圾打印输出。 这是我的密码。有人能帮我解决这个问题吗

import keyboard
import csv
import time

global numOfKeyStrokes  #In order to compare each elemtn's letter one by one with keystroke
numOfKeyStrokes = 0

def keyStroke():
    temp = keyboard.read_key()
    time.sleep(0.1)
    global numOfKeyStrokes
    numOfKeyStrokes += 1
    return temp

def init():
    f = open('./DataBase.csv')
    data = csv.reader(f)
    getKeyStroke = []
    matchingFlag = False

    while True: # looping in order to keep getting keystrokes
        global numOfKeyStrokes
        getKeyStroke.append(keyStroke())
        print(getKeyStroke)
        print("numOfKeyStrokes ", numOfKeyStrokes)
        for word in data: # each row is an each cell in a csv file
            matchingFlag = False
            for char in range(numOfKeyStrokes):  # each x is an each letter in an each cell
                print("word[9][char]==getKeyStroke[numOfKeyStrokes-1]", word[9]        [char].lower(),",",getKeyStroke[numOfKeyStrokes-1])
                if word[9][char].lower() == getKeyStroke[numOfKeyStrokes-1]:
                    print("char matched")
                    matchingFlag = True
                    break
                else:
                    matchingFlag = False
                    break
            if matchingFlag == True : print(word[9])

    f.close()

init()

Tags: csvtoinimportfordataorderword
1条回答
网友
1楼 · 发布于 2024-10-01 22:28:39

代码只工作一次的原因是,在init函数开始时打开csv文件一次

当您将其传递给csv.reader并迭代整个文件时,您将消耗资源。在进行下一次迭代时,文件/读取器为空,因此for word in data循环将不会运行

我已经对您的程序进行了相当重要的重构,因此我不一定知道这是否仍能实现您想要的行为,尤其是在不知道您的csv是如何设置的情况下,但我认为您正在寻找类似以下内容:

import csv
import time

import keyboard


def key_stroke_gen():
    num_of_key_strokes = 0
    while True:
        num_of_key_strokes += 1
        yield num_of_key_strokes, keyboard.read_key()
        time.sleep(0.1)


def init():
    get_key_stroke = []
    words = []
    with open('./DataBase.csv') as f:
        data = csv.reader(f)
        for row in data:
            for word in row:
                words.append(word.strip().lower())

    for num_of_key_strokes, key_stroke in key_stroke_gen():
        get_key_stroke.append(key_stroke)
        for word in words:
            if word[:num_of_key_strokes] == ''.join(get_key_stroke):
                print(word)


if __name__ == '__main__':
    init()

总体而言,直接在生成器中生成搜索字符串可能是一种更好的方法,因为在一个位置管理搜索字符串的构建并将处理代码分开更容易

import csv
import time

import keyboard


def search_strs():
    search_str = ""
    while True:
        time.sleep(0.1)
        key_press = keyboard.read_key()
        if key_press == "backspace" and search_str:
            search_str = search_str[:-1]
        elif len(key_press) == 1 and ('a' <= key_press <= 'z'):
            search_str += keyboard.read_key()
        else:
            continue
        yield search_str


def init():
    words = []
    with open('./DataBase.csv') as f:
        data = csv.reader(f)
        for row in data:
            for word in row:
                words.append(word.strip().lower())

    for search_str in search_strs():
        for word in words:
            if word[:len(search_str)] == search_str:
                print(word)


if __name__ == '__main__':
    init()

相关问题 更多 >

    热门问题