Есть ли способ в окне ввода Tkinter заменить запятую на точку? - PullRequest
0 голосов
/ 30 апреля 2019

Есть ли способ заменить запятую на точку в поле ввода Tkinter?
Например, если пользователь вводит запятую (,), на экране появится точка.

1 Ответ

3 голосов
/ 30 апреля 2019

Вы можете использовать функцию связывания для входа с событием <KeyRelease-comma>. Она запустит эту функцию после , поставит запятую в Entry, а затем функция сможет получить текст из `Entry и заменить его новым текстом с точкой вместо запятой.

import tkinter as tk

def callback(event):
    print('event.widget.get():', event.widget.get())
    text = event.widget.get()     # get all text
    text = text.replace(',', '.') # replace comma
    event.widget.delete(0, 'end') # remove all text from Entry
    event.widget.insert(0, text)  # put new text in Entry


root = tk.Tk()

e = tk.Entry(root)
e.pack()
e.bind('<KeyRelease-comma>', callback)

root.mainloop()

Если вы используете <Key-comma>, тогда функция будет выполняться до того, как tkinter поместит символ в Entry, так что вы получите текст без запятой и не сможете его изменить.


Вы можете использовать StringVar() в Entry(..., textvariable=...) и вызывать функцию до StringVar. trace('w', ...) выполнит функцию, когда tkinter изменит (установит) текст в StringVar.

import tkinter as tk

def callback(id_, mode, other):
    #print(id_, mode, other)
    var.set( var.get().replace(',', '.') )


root = tk.Tk()

var = tk.StringVar()
var.trace('w', callback)

e = tk.Entry(root, textvariable=var)
e.pack()

root.mainloop()

РЕДАКТИРОВАТЬ: с помощью <Key-comma> вы можете выполнить функцию до того, как tkitner введите запятую в Entry. Функция может поставить точку и использовать return "break", чтобы остановить событие, и она не будет ставить запятую в Entry

import tkinter as tk

def callback(event):
    #print('event.widget.get():', event.widget.get())
    event.widget.insert('end', '.')  # put new text in Entry
    return 'break' # stop event so it will not put comma in Entry

root = tk.Tk()

e = tk.Entry(root)
e.pack()
e.bind('<Key-comma>', callback) # execute callback before it puts comma in Entry

root.mainloop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...