#python #tkinter
#python #tkinter
Вопрос:
Я работаю в TCP-чате с графическим интерфейсом (tkinter), и я не хочу принимать какие-либо ‘:’ в моем сообщении, вводимом пользователем.
Поэтому я решил, что каждый раз, когда пользователь вводит ‘:’ в поле ввода, будет вызываться функция, а ‘:’ будет удален. Но бывает, что сначала вызывается функция, последний символ удаляется, а затем в поле ввода вводится ‘:’.
Вот мой код:
#CODE OMITTED
def typing_error():
temp_text = message_entry.get()[:-1]
message_entry.delete(0, 'end')
message_entry.insert(0, temp_text)
messagebox.showerror("Error", "Semicolon(:) is not allowed")
# Text box to send message
message_entry = tk.Entry(root, bg='grey')
message_entry.pack(side='bottom', fill='x')
message_entry.bind(':', lambda x: typing_error())
#CODE OMITTED
Это перед вводом ‘:’
После ввода ‘:’
После анализа сообщения об ошибке
Ну, я знаю, почему это происходит, но не могу понять, как это решить. пожалуйста, помогите мне.
Комментарии:
1. Если я прав, вы все равно можете просто вставить текст с двоеточиями в поле
Ответ №1:
Просто вернитесь "break"
, чтобы отменить его при обратном вызове bind:
def typing_error(event):
messagebox.showerror("Error", "Semicolon(:) is not allowed")
return "break"
...
message_entry.bind(':', typing_error)
Комментарии:
1. Спасибо, это сработало, я использовал
lambda
без какой-либо причины, и я не знал, что"break"
это остановит текущую функцию
Ответ №2:
Используйте этот код, чтобы сначала отобразить сообщение об ошибке, а затем удалить точку с запятой.
def typing_error():
messagebox.showerror("Error", "Semicolon(:) is not allowed")
message_entry.delete("end-2c")
message_entry = tk.Entry(root, bg='grey')
message_entry.pack(side='bottom', fill='x')
message_entry.bind(':', typing_error)
Комментарии:
1. Нет, это не проблема. Я попробовал это, и он удаляет первый символ поля, но точка с запятой есть. На самом деле сначала вызывается функция, а затем в текстовое поле вставляется точка с запятой. Я хочу сначала вставить точку с запятой в текстовое поле, а затем вызвать функцию.
2. @SatyajitSatapatathy Вместо создания временной переменной и удаления всего текста. Просто удалите последний символ, который, очевидно, будет ‘:’. Но перед этим отображается сообщение об ошибке. Я отредактирую код, обязательно проверю.
3. Теперь он выдает ошибку, которая
"end-2c"
является плохим шлюзом4. @SatyajitSatapatathy Попробуйте
len(message_entry.get()) - 1
вместо'end-2c'
5. @SatyajitSatapatathy Я только что заметил, что способ, которым вы использовали bind, подвержен ошибкам, измените его на
message_entry.bind(":", typing_error)
.