Tkinter — изменение всех алфавитов текста кнопок на верхний регистр при нажатии кнопки

#python #python-3.x #tkinter

#python #python-3.x #tkinter

Вопрос:

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

Перед нажатием кнопки Shift мой список должен выглядеть так

 buttons = [
    '!', 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', '←', '7', '8', '9', '-',
    'Tab', 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', '[', ']', '4', '5', '6', ' ',
    'Shift', 'z', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.', '/', '?', '*', '1', '2', '3',
    ' Space ' 
]
  

и после нажатия кнопки shift я хочу, чтобы мой список кнопок выглядел так

 shift_buttons = [
    '!', 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', '←', '7', '8', '9', '-',
    'Tab', 'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L', '[', ']', '4', '5', '6', ' ',
    'Shift', 'Z', 'X', 'C', 'V', 'B', 'N', 'M', ',', '.', '/', '?', '*', '1', '2', '3',
    ' Space ' 
]
  

Короче говоря, как я могу изменить текст кнопки из первого списка во второй список, просто щелкнув виджет кнопки?

Комментарии:

1. Где находится код кнопки, пожалуйста, укажите это тоже

2. Ссылка на GitHub Вот весь мой код на данный момент

3. Пожалуйста, укажите свой код в своем вопросе.

4. В коде нет ничего, что показывало бы, что вы еще пытались реализовать shift нажатие кнопки.

5. Я рекомендую не давать такой сложный код, чтобы мы могли понять, что делается, сделайте другой пример, похожий на вашу ситуацию, и включите его, чтобы мы могли помочь в этом. По сути, вы захотите привязаться к window и при 'Shift' каждом нажатии вы хотите изменить текст кнопки, используя config() , но не уверены, как вы определяете свои кнопки там.

Ответ №1:

Основываясь на коде в ссылке Github, предложите:

  • определите переменную shift_on для хранения текущего состояния Shift ключа
  • определите список letter_buttons для хранения ссылок на буквенные кнопки (от ‘a’ до ‘z’)
 shift_on = False
letter_buttons = []
  

Затем измените buttonClick() , как показано ниже:

 def is_letter(s):
    return len(s) == 1 and 'a' <= s <= 'z'

def buttonClick(input):
    global shift_on
    if input == 'Shift':
        # toggle shift state
        shift_on = not shift_on
        # update the text of the letter buttons
        for btn in letter_buttons:
            text = btn['text']
            btn['text'] = text.upper() if shift_on else text.lower()
    else:
        if input == ' Space ':
            textBox.insert(INSERT,' ')
        elif input == 'Tab':
            textBox.insert(INSERT, '    ')
        elif input == '←':
            backspace()
        else:
            if is_letter(input):
                input = input.upper() if shift_on else input.lower()
            textBox.insert(INSERT, input)
  

И измените цикл for для создания кнопок, как показано ниже:

 for button in buttons:
    # command to run on every button click - buttonClick() function 
    cmd = lambda x = button: buttonClick(x)

    # for every button except 'space'
    if button != ' Space ':
        btn = tk.Button(keyboardApp,
            text = button, 
            width = 7,
            bg = 'black',
            fg = 'white',
            activebackground = 'white',
            activeforeground = 'black',
            relief = 'raised',
            padx = 3,
            pady = 3, 
            bd = 5,
            font=('arial', 12, 'bold'),
            command = cmd)
        btn.grid(row = varRow, column = varCol)
        # save the reference of letter buttons
        if is_letter(button):
            letter_buttons.append(btn)
    ...
  

Комментарии:

1. Большое вам спасибо, @acw1668. Это именно то, что я хотел, чтобы мой код делал!! Высоко ценится 🙂

Ответ №2:

Сначала вы должны создать функцию, которая выполняет преобразование. Например, из вашего кода определите функцию, которая выполняет что-то вроде

 def shift_buttons():
    buttons = shift_buttons
  

Примечание: Под кнопками и shift_buttons я подразумеваю изменение обычных кнопок с клавиатуры на заглавные кнопки на экранной клавиатуре. Надеюсь, вы понимаете, что я имею в виду.