Я хочу привязать свои кнопки tkinter к клавишам на цифровой клавиатуре. Что я делаю не так, пожалуйста? - PullRequest
1 голос
/ 12 марта 2020

Python noob здесь, у меня есть каталог закусок из торгового автомата, текст в речь, а также кнопка «Назад», «Далее» и «Текущий».

Я хочу назначить свои кнопки клавишам на цифровой клавиатуре но это не похоже на работу. Когда всплывает gui, я могу нажать кнопку, и он будет читать элементы списка для меня, но я хочу иметь возможность управлять им с помощью цифровой клавиатуры, а не с помощью мыши нажимать кнопки.

vl = ["donuts","cookies","spicy chips","mild chips","cheesy chips","mini donuts","Mrs. Freshlys Cupcakes","rubbery cake thing"]
import pyttsx3
engine = pyttsx3.init()
cupo = vl[0] # cupo is current position, 0 is the first entry in the vl list
def current():
       global cupo # cupo was defined outside of the function, therefore we call global
       engine.say(cupo)
       engine.runAndWait()


def back():
        global cupo
        pos = vl.index(cupo)
        if pos == 0: # pos is position
                engine.say(cupo)
                engine.runAndWait()
        else:
                prepo = int(pos) - 1 # prepo is previous position
                cupo = vl[prepo]
                engine.say(cupo)
                engine.runAndWait()


def next():
        global cupo
        pos = vl.index(cupo)
        if pos == (len(vl) - 1):
                engine.say(cupo)
                engine.runAndWait()
        else:
                nexpo = int(pos) + 1 # nexpo is next position
                cupo = vl[nexpo]
                engine.say(cupo)
                engine.runAndWait()

print('\n'.join(map(str,vl)))

import tkinter
import sys




window = tkinter.Tk()
window.title("GUI")

def vendy():
    tkinter.Label(window, text = "Vendy!").pack()

b1 = tkinter.Button(window, text = "Back", command = back).pack()
b2 = tkinter.Button(window, text = "Repeat", command = current).pack()
b3 = tkinter.Button(window, text = "Next", command = next).pack()

bind('/',back.func)
bind('*',current.func)
bind('-',next.func)

window.mainloop()

Ответы [ 2 ]

1 голос
/ 12 марта 2020

Вы не привязаны ни к чему указанному c. Вы должны связать что-то. Таким образом, в этом случае вы хотите привязать к окну root, чтобы ключевое событие всегда обнаруживалось.

Вам также необходимо изменить способ вызова функций в привязке. back.func не правильно. Вместо этого просто используйте back.

Далее измените имя вашей функции next, поскольку это уже имя сборки для Python, поэтому вы перезаписываете этот полезный метод.

Далее каждая из этих функций должна принимать хотя бы один аргумент для обработки события, которое отправляется функции из привязки. Если вам нужно также вызвать эту функцию из какого-то другого места без отправки аргумента, вы можете использовать event=None для обработки всего, что вызывает функцию.

Затем поместите все ваши операции импорта сверху. Вы всегда должны держать импорт наверху.

Вот исправленная версия вашего кода:

import tkinter
import pyttsx3
# import sys  # this import is not used.


vl = ["donuts", "cookies", "spicy chips", "mild chips", "cheesy chips",
      "mini donuts", "Mrs. Freshlys Cupcakes", "rubbery cake thing"]

engine = pyttsx3.init()
cupo = vl[0]  # cupo is current position, 0 is the first entry in the vl list


def current(event=None):
    global cupo  # cupo was defined outside of the function, therefore we call global
    engine.say(cupo)
    engine.runAndWait()


def back(event=None):
    global cupo
    pos = vl.index(cupo)
    if pos == 0:  # pos is position
        engine.say(cupo)
        engine.runAndWait()
    else:
        prepo = int(pos) - 1  # prepo is previous position
        cupo = vl[prepo]
        engine.say(cupo)
        engine.runAndWait()


def next_func(event=None):
    global cupo
    pos = vl.index(cupo)
    if pos == (len(vl) - 1):
        engine.say(cupo)
        engine.runAndWait()
    else:
        nexpo = int(pos) + 1  # nexpo is next position
        cupo = vl[nexpo]
        engine.say(cupo)
        engine.runAndWait()


def vendy():
    tkinter.Label(window, text="Vendy!").pack()


print('\n'.join(map(str, vl)))
window = tkinter.Tk()
window.title("GUI")
tkinter.Button(window, text="Back", command=back).pack()
tkinter.Button(window, text="Repeat", command=current).pack()
tkinter.Button(window, text="Next", command=next_func).pack()
window.bind('/', back)
window.bind('*', current)
window.bind('-', next_func)
window.mainloop()
1 голос
/ 12 марта 2020
window.bind('/', back)
window.bind('*', current)
window.bind('-', next)

Параметр события передается в функции, поэтому добавьте к ним аргумент.

Пример:

def back(event=None):
    ...
...