在 tkinter 中输入希腊字符
Posted
技术标签:
【中文标题】在 tkinter 中输入希腊字符【英文标题】:Typing Greek characters in tkinter 【发布时间】:2020-12-11 23:21:54 【问题描述】:我正在尝试编写一个界面(在 Python 3.8 中,使用 tkinter)来接受希腊语文本(在 Windows 10 中使用希腊语多调键盘键入)。但是,Entry
和 Text
不会接受所有键入的希腊字符:可以单独键入希腊字母,但如果我尝试键入除尖音以外的任何带有变音符号的字母,则会显示 ?
而不是性格。 (我认为 tkinter 接受“希腊语和科普特语”中的字符,但不接受“希腊语扩展”Unicode 块中的字符。)我知道 tkinter 可以显示这些字符,因为它们在被程序插入时显示得很好(例如 @987654324 @ 插入 ῆ
但只需使用键盘的快捷键键入该字符即可插入 ?
)。我需要做什么才能让 tkinter 识别键入的希腊字符?
(我还尝试通过添加 TextInstance.bind('[h', lambda *ignored: TextInstance.insert(tkinter.INSERT, 'ῆ'))
每个字符及其快捷键来重新绑定键盘快捷键;这在英文键盘中有效(尽管也插入了激活事件的字符),但在字母键上的希腊 Polytonic 键盘绑定根本没有激活。)
【问题讨论】:
记录不起作用的字符串的代码点可能会有所帮助([ord(c) for c in not_working_string]
另外,也许尝试使用不同的字体。
【参考方案1】:
您可以通过将'<Key>'
(即,按下键盘上的任何键)绑定到一个函数来执行此操作,然后使用event.keycode
(对于任何给定的键没有相同的值)检查按下的键无论您的计算机设置使用什么键盘),然后插入预期的字符。但是,对于多键键盘快捷键,您必须跟踪以前的击键,因为传递给函数的事件对象可能只包括最后一个:即使您绑定,例如 widget.bind('<Control-Key-c>', some_function)
,传递给函数的事件将包括c
但不包括控制键——至少在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()
【讨论】:
以上是关于在 tkinter 中输入希腊字符的主要内容,如果未能解决你的问题,请参考以下文章
Python怎么将tkinter 输入框中输入的字符串内容转换为 整数类型?
Python3 Tkinter基础 Entry show textvariable 密码输入框 输入字符 显示 特殊字符