Чтобы получить все функции в виджете Entry
, вам нужно изменить его.
Отсоедините последовательность <Key>
, а также <BackSpace>
из виджета Entry
.
Обоснуйте текст для выравнивания по центру, настроив justify='center'
.
Чтобы получить желаемое имя клавиши, вам необходимо связать <Key>
с виджетом Entry
и получить event.keysym
, поскольку оно дает вам имя нажатой клавиши.
Если вы не хотите видеть мигание insert
в виджете Entry
, вы можете попробовать insertwidth=0
, но для меня это не работает, не знаю почему, поэтому я переключаюсь между «только для чтения» и «нормальные» состояния, как и в функции self._display(..)
, когда виджет Entry
находится в состоянии «только для чтения», он не допускает вставки текста.
Вот пользовательский класс Entry_Box
, унаследованный от виджета Entry
.
import tkinter as tk
class EntryBox(tk.Entry):
def __init__(self, master=None, cnf={}, **kw):
kw = tk._cnfmerge( (kw, cnf) )
kw['justify'] = kw.get('justify', 'center')
kw['state'] = 'readonly'
super(EntryBox, self).__init__(master=master, **kw)
self.bind_class(self, '<Key>', self._display)
def _display(self, evt):
self['state'] = 'normal'
self.delete('0', 'end')
self.insert('0', str(evt.keysym))
self['state'] = 'readonly'
if __name__ == "__main__":
root = tk.Tk()
EntryBox().pack()
root.mainloop()
Краткое объяснение кода:
tk._cnfmerge()
является внутренней функцией библиотеки tkinter, цель этой функции - объединить несколько словарей вместе. Теперь вы можете быть удивлены, что мы можем комбинировать словари без этой функции. Да, мы можем, но таким образом мы не получим никаких ошибок, например, если какой-либо из словарей будет None Вот исходный код для функции.
Функция bind_class
похожа на функцию bind
, но она ссылается на внутреннее имя класса, например, Entry
виджет имеет привязки, подобные <Key>, <BackSpace>, <Return>, ...
, которые являются внутренними привязками, поэтому, если пользователь пытается связать или отменить привязку любого последовательность не будет мешать внутренним связываниям, пока они не будут использовать unbind_class
с тем же именем className (className похоже на тег), заданным внутри. Этот пост может объяснить лучше.