Вызывайте функцию каждый раз, когда в виджете ввода Tkinter вводится точка с запятой

#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) .