#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 я подразумеваю изменение обычных кнопок с клавиатуры на заглавные кнопки на экранной клавиатуре. Надеюсь, вы понимаете, что я имею в виду.