Я хочу получать ключевые события без использования tkinter. Должен ли я использовать Pynput? Как я могу это сделать? - PullRequest
0 голосов
/ 26 марта 2020

Работает замечательно, как есть, и я очень доволен этим, но я хочу использовать то, что не требует gui. Он будет работать без монитора, загружаться в командную строку и автоматически запускать программу, и будет просто иметь USB-клавиатуру, торчащую для ввода. Или, может быть, матричная клавиатура, если я научусь взаимодействовать с одним из них. Как я могу получить ключевые события в моем коде и заставить его работать так же без tkinter? Pynput? Что-то другое? Нужно ли мне также переходить с аудио-микшера Pygame на что-то другое для воспроизведения звука?

Я задавал несколько вопросов о SO во время создания этого проекта, и очень благодарен за помощь и руководство, которые мне дали все далеко. Спасибо!

from gtts import gTTS
import pygame
from io import BytesIO
import sys
import time
import csv

pygame.init()
if sys.version_info[0] == 3:
    # for Python3
    from tkinter import *   
else:
    # for Python2
    from Tkinter import *

def say(text):
    tts = gTTS(text=text, slow=False, lang='en-us', lang_check=False)
    fp = BytesIO()
    tts.write_to_fp(fp)
    fp.seek(0)
    pygame.mixer.init()
    pygame.mixer.music.load(fp)
    pygame.mixer.music.play()



def load_list():
    with open(r"/home/pi/VendyLogProject/vendylist.csv", mode="r") as infile:
        return sorted(list(csv.reader(infile)))

def refresh_list():
    global vl, vl2, baseposition
    new_items = load_list()
    if vl != new_items:
        vl = new_items
        vl2 = [item[0] for item in vl]
        baseposition = vl[0]






vl = load_list()

vl2 = [item[0] for item in vl]

baseposition = vl[-1] # so when reading through it reads entry 0 first, then 1




def current(event=None):
        global baseposition # baseposition was defined outside of the function, therefore we call global
        say(baseposition[1]+baseposition[0])



def back(event=None):
        global baseposition
        currentposition = vl.index(baseposition)
        if currentposition == 0: 
                baseposition = vl[-1]
                say(baseposition[1]+baseposition[0])

        else:
                previousposition = int(currentposition) - 1 # previousposition is previous position
                baseposition = vl[previousposition]
                say(baseposition[1]+baseposition[0])



def forward(event=None):
        global baseposition
        currentposition = vl.index(baseposition)
        if currentposition == (len(vl) - 1):
                baseposition = vl[0]
                say(baseposition[1]+baseposition[0])
        else:
                nextposition = int(currentposition) + 1 # nextposition is next position
                baseposition = vl[nextposition]
                say(baseposition[1]+baseposition[0])


def readnumber(int):
           global vl
           for item in vl:
            global baseposition
            currentposition = vl.index(baseposition)
            if int == item[0]:
                      baseposition = vl[vl.index(item)]
                      say(baseposition[1]+baseposition[0])


def help():
           say("Welcome to Vendy log! Use the plus and minus keys to go through the list of snacks or push a number to hear its contents!")







root = Tk()
prompt = '      VendyLog      '
label1 = Label(root, text=prompt, width=len(prompt))
label1.pack()

#keys buffer
keybuf = []

def test_after():
           if keybuf:
                      num = ''.join(keybuf)
                      keybuf.clear()




def get_key(event):
           keybuf.append(event.char)
           event.char = ''.join(keybuf)
           root.after(500,test_after)
           if event.char == '-':
                      back()
           elif event.char == '+':
                      forward()
           elif event.char == '.':
                      current()
           elif event.char in vl2:
                      readnumber(event.char)
           elif event.char == '00':
                      help()
           elif event.char == '462.':
                sys.exit()

def refresh_list_and_enqueue_next_refresh():
    refresh_list()
    root.after(60000, refresh_list_and_enqueue_next_refresh)




refresh_list_and_enqueue_next_refresh()                                            

root.bind_all('<Key>', get_key)

root.mainloop()

Это программа помощи говорящего торгового автомата, которая импортирует список и считывает записи из списка, по которым перемещаются + и -, или читает точные записи, если нажаты цифровые клавиши.

...