Создание функций BackSpace и Enter в пользовательской программе Python tkinter - PullRequest
0 голосов
/ 28 апреля 2018

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

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

from tkinter import *
root = Tk()
prompt = '      Press any key      '
label1 = Label(root, text=prompt, bg='black', fg='green')
label1.grid(row=0, column=0)
prompt2=''
def key(event):
    global prompt2
if event.char == event.keysym:
    prompt2 = prompt2 + event.char
elif len(event.char) == 1:
    prompt2 = prompt2 + event.char
else:
    pass
label1.config(text=prompt2)
root.bind_all('<Key>', key)
root.update()
root.mainloop()

Итак, что я хочу сделать (и пытаюсь сделать):

  1. Создайте функцию, позволяющую пользователю использовать BackSpace и не позволяйте ему использовать Enter (поскольку я не хочу, чтобы они переходили на новую строку).
  2. Установите для переменной значение True, дайте программе сигнал о том, когда начинать (принимать данные) и когда останавливать.

Но я не могу этого сделать. Есть предложения на 1 или 2? Пожалуйста, сообщите мне в разделе комментариев.

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

1 Ответ

0 голосов
/ 28 апреля 2018

Почему вы сравниваете event.char с event.keysym? Это всегда будет True для печатных символов и всегда будет False для последовательностей символов и специальных символов (таких как и ).

Как насчет этого ( не проверено )?

import string
import tkinter as tk
# See side note 1

def key_event(label, event):
    label_text = label.cget("text")
    if event.keysym == "backspace":
        label.config(text=label_text[:-1])
    elif event.keysym == "return":
        # Disallow 'return'
        pass
    elif event.char in string.ascii_lowercase:
        # Character is an ASCII letter
        label.config(text=label_text + event.char)

def main():
    root = tk.Tk()
    prompt = "      Press any key      "
    label = tk.Label(root, text=prompt, bg="black", fg="green")
    label.grid(row=0, column=0)
    label.bind("<Key>", lambda e: key_event(label, e))
    # See side note 2
    label.focus()
    # Give keyboard focus
    root.mainloop()

Примечание 1: избегайте использования подстановочных знаков при импорте (from ... import *). Вместо этого псевдоним tkinter 'как' tk:

import tkinter as tk
root = tk.Tk()
...

Примечание 2: избегайте использования глобальных переменных, предпочитайте использовать класс (при условии, что вы знаете, как их правильно использовать, см. Пример в разделе ниже), или для действительно небольших фрагментов кода делите переменные, используя лямбды, как я.


import string
import tkinter as tk


class EditableLabel(tk.Label):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.bind("<Key>", self._key_event)

    def _key_event(self, event):
        keysym, char = event.keysym, event.char
        text = self.cget("text")
        if keysym == "backspace":
            self.config(text=text[:-1])
        elif keysym == "return":
            pass
        elif char in string.ascii_lowercase + string.digits:
            self.config(text=text + char)


class MyApplication(tk.Frame):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self._add_and_draw_widgets()

    def _add_and_draw_widgets(self):
        for i in range(3):
            EditableLabel(self, text="Label #{}".format(i)).grid(column=0, row=i)


def main():
    root = tk.Tk()
    app = MyApplication(root)
    app.grid(column=0, row=0)
    root.mainloop()

if __name__ == "__main__":
    main()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...