Основная проблема заключается в том, что вы вводите бесконечный цикл, когда вы нажимаете букву, отличную от 's'. Когда вы нажмете 's', для выхода из цикла потребуется 50 секунд, чтобы начать снова при следующем нажатии клавиши. Кроме того, ваша переменная скорости находится только внутри функции нажатия клавиш, поэтому вы не можете получить к ней доступ в любом случае, вы также перезагружаете ее до 50 при каждом нажатии клавиши.
Пара ключевых вещей, которые вам нужно знать о tkinter, заключается в том, что time.sleep
следует избегать и пытаться иметь, когда петли работают в фоновом режиме.
Теперь есть несколько вариантов для этого. Вы можете привязать функцию к каждому отдельному ключу.
import tkinter as tk
def onKeyPress(event, value):
global speed # alter the global speed variable inside a function
# Keep in mind this insert will only occur for the selected keys
text.insert('end', 'You pressed %s\n' % (event.char,))
speed += value # update speed variable with value
print(speed) # print current speed
speed = 50
root = tk.Tk()
root.geometry('300x200')
text = tk.Text(root, background='black', foreground='white', font=('Comic Sans MS', 12))
text.pack()
# Individual key bindings
root.bind('<KeyPress-w>', lambda e: onKeyPress(e, 1)) # value is 1 for 'w'
root.bind('<KeyPress-s>', lambda e: onKeyPress(e, -1)) # value is -1 for 's'
root.mainloop()
Или альтернативный, как прежде, вы можете использовать операторы if для проверки введенной буквы. if elif
используется вместо if
для каждой буквы, потому что, хотя он имеет тот же эффект, блок if прекратится, когда условие будет истинным, иначе оно будет проходить через все операторы if.
import tkinter as tk
def onKeyPress(event):
global speed # alter the global speed variable inside a function
text.insert('end', 'You pressed %s\n' % (event.char,))
if event.char == 'w':
speed += 1
elif event.char == 's':
speed -= 1
print(speed) # print current speed
speed = 50
root = tk.Tk()
root.geometry('300x200')
text = tk.Text(root, background='black', foreground='white', font=('Comic Sans MS', 12))
text.pack()
root.bind('<KeyPress>', onKeyPress)
root.mainloop()
Side Примечание:
В настоящее время, когда я нажимаю письмо будет вставить "sYou pressed s"
из начального нажатия клавиши. Если вы добавите это перед строкой вставки, он удалит введенный символ, указав вместо этого "You pressed s"
.
text.delete("%s-1c" % 'insert', 'insert')
Спасибо! Именно то, что я хотел. –