在Tkinter中键入希腊字符

问题描述

我正在尝试编写一个接口(在Python 3.8中使用tkinter)来接受希腊文本(在Windows 10中使用希腊多调键盘键入)。但是,EntryText不会接受所有键入的希腊字符:可以单独键入希腊字母,但是如果我尝试键入除变音符号之外的其他变音符号,{{1显示}}而不是字符。 (我认为tkinter接受“希腊和科普特语”中的字符,但不接受“希腊扩展” Unicode块中的字符。)我知道tkinter可以显示此类字符,因为当程序插入它们时它们会很好地显示(例如{ 1}}会插入?,但只需使用键盘快捷键键入该字符就会插入TextInstance.insert(tkinter.INSERT,'ῆ'))。我需要做什么才能使tkinter识别键入的希腊字符?

(我还尝试通过在每个字符及其快捷方式上添加

来重新绑定键盘快捷键;该快捷键在英语键盘中有效(尽管也插入了激活事件的字符),但在希腊语多调键盘中,完全没有激活对字母键的绑定。)

解决方法

γειασουφιλε,

unicode与tkinter和python完美配合

您可能还会对Unicode“ greek + extended”感兴趣


我的第一个答案太短,无法给出该技术背后的全部思想: 因此,想法是在需要时转换字符。

我记得在希腊键盘上,您按住alt并按下要转换的字符,如果多次按下,它将再次更改。

这就是我要做的,使其更明确,希望它能给您带来使您的代码按您喜欢的方式工作的想法。

import tkinter as tk

root = tk.Tk()


E = tk.Entry(root)
E.pack()

_mod = tk.BooleanVar(value=False)
_val = tk.StringVar()


def tracker(event):   
    if event.keysym_num == 65513:
        _mod.set(True) #check if "left alt" key was pressed and set flag
        
    key = event.keysym #check which key was preesed
    if _mod.get() and event.char != '': #if flag(_mod is True and character is char
        if key == 'a': #if key is char a
            if not _val.get(): #if there wasn't an setting yet for _val
                a = '\u03B1' #unicode alpha
            if _val.get() == '\u03B1': #if _val.get is unicode alpha
                a = '\u03AC' #unicode alpha with tonos
            _val.set(a)
            return "break"  #dont go for default binding

def mod_off(event):
    _mod.set(False) #set flag to false
    val = _val.get() #get the chosen character
    E.insert('end',val) #insert it in entry
    _val.set('') #set _val to nothing

E.bind('<Key>',tracker)
E.bind('<KeyRelease-Alt_L>',mod_off)


root.mainloop()
,

您可以通过将'<Key>'(即按下键盘上的任何键)绑定到一个函数来执行此操作,然后使用event.keycode(该键具有相同的值任何给定的键(无论您的计算机设置为使用哪种键盘),然后插入所需的字符。但是,使用多键键盘快捷键时,您必须跟踪以前的击键,因为传递给函数的事件对象可能只包括最后一个键:即使您绑定了widget.bind('<Control-Key-c>',some_function),事件也传递给了该对象。该功能将包含c但不包含Control键-至少在event.keycode中,并且当键盘不适用于tkinter时,事件的其他属性不一定可靠或有用。要将/a绑定到(带有平滑呼吸和重音标记的小写字母),我将每个'<Key>'事件添加到列表中,并设置了仅在右组合:

import tkinter as tk

root=tk.Tk()
e=tk.Entry(root); e.pack()
keyspressed=[]
def pressKey(event,widget):
    keyspressed.append(event)
    print(event.keycode,event.char,"pressed.")

    if len(keyspressed)>1: #to avoid an index-out-of-range error if only one key has been pressed so far
        #if the last two keys were / and A,insert ἄ i.e. /u1f04
        if keyspressed[-2].keycode==191 and keyspressed[-2].char!='/' and event.keycode==65:
            #65 is A; 191 is /; the char check is to make sure the / is not being used
            # to type / on a different keyboard.
            widget.insert(tk.INSERT,'\u1f04') #insert the character
            return 'break' #this stops ? from being typed

e.bind("<Key>",lambda event: pressKey(event,e))

root.mainloop()

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...