Пользовательская программа ввода Python tkinter canvas не работает - PullRequest
0 голосов
/ 06 мая 2018

Я строю программу-симулятор на окне Python 3 Tkinter. Прогресс теперь прерывается из-за ошибки в программе ввода, которую я создаю сам.

Неработающий код, над которым я сейчас работаю:

import string
import tkinter as tk
text = "awdd"
doIt=True


def key_event(label, event):
    global doIt, text
    text = w.itemcget(label,"text")
    if doIt==False:
        return 1
    if event.keysym == "BackSpace":
        w.itemconfig(label, text=text[:-1])
    elif event.keysym == 'space':
        w.itemconfig(label, text=text + ' ' )
    elif event.keysym == "Return":
        doIt=False
        password=text
        print ('PASSWORD:%s' % (password))
        print ('PROGRAM STOPPED')
    elif event.char in string.ascii_lowercase:
       # Character is an ASCII letter
        w.itemconfig(label, text = text + event.char)

def main():
    root = tk.Tk()
    w = tk.Canvas(root, width=200, height=100)
    w.pack()
    label = w.create_text(1,0, text=text, fill= 'green', anchor='nw', font=
('courier',13))

    w.tag_bind(label,"<Key>", lambda e: key_event(label,e))

    root.update()
    # See side note 2
    root.mainloop()
main()

Таким образом, программа будет проверять ввод от пользователя, пока doIt == True . Но когда я запускаю программу, функция key_event () вообще ничего не делает! Есть предложения?

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 07 мая 2018

Вы должны захватывать ввод не с холста, а с Тинкера root, а для доступа к w в key_event вам нужно сделать его глобальным. Полный рабочий код выглядит следующим образом:

import string
import tkinter as tk
text = "password: "
doIt=True
w = None


def key_event(label, event):
    global doIt, text
    text = w.itemcget(label,"text")
    if doIt==False:
        return 1
    if event.keysym == "BackSpace":
        w.itemconfig(label, text=text[:-1])
    elif event.keysym == 'space':
        w.itemconfig(label, text=text + ' ' )
    elif event.keysym == "Return":
        doIt=False
        password=text
        print ('PASSWORD:%s' % (password))
        print ('PROGRAM STOPPED')
    elif event.char in string.ascii_lowercase:
       # Character is an ASCII letter
        w.itemconfig(label, text = text + event.char)


def main():
    root = tk.Tk()
    global w
    w = tk.Canvas(root, width=400, height=200)
    w.pack()
    label = w.create_text(1,0, text=text, fill= 'green', anchor='nw', font=
('courier',13))

    # w.tag_bind(label,"<Key>", lambda e: key_event(label,e))
    root.bind('<Key>', lambda e: key_event(label,e))

    root.update()
    # See side note 2
    root.mainloop()
main()
0 голосов
/ 06 мая 2018

Трудно захватить нажатия клавиш из холста, поскольку холст не получает фокус клавиатуры. Вы могли бы сделать это с помощью w.focus_set(), но я не уверен, можно ли вообще дать фокус клавиатуры виджету холста ...

Почему бы не связываться с корнем вместо:

root.bind('<Key>', lambda e: key_event(label,e))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...