tkinter 的文本小部件插入方法不起作用

The text widget insert method of tkinter not working

我一直在开发一个应用程序,我想在其中自动完成括号圆方块之类的东西。我已经完成了使用 tkinter 的插入方法和 tk.INSERT 常量作为索引,如下所示:

def autocomplete(self, val) :
    if val == '(' :
        self.insert(tk.INSERT, ')')
    elif val == '{' :
        self.insert(tk.INSERT, '}')
    elif val == '[' :
        self.insert(tk.INSERT, ']')
    elif val == '\'' :
        self.insert(tk.INSERT, '\'')
        self.mark_set('sentinel', str(float(self.index(tk.INSERT)) - 0.1))
    elif val == '\"' :
        self.insert(tk.INSERT, '\"')
        self.mark_set('sentinel', str(float(self.index(tk.INSERT)) - 0.1))
    elif val == ':' :
        text = self.get(1.0, tk.INSERT).strip().replace(' ', '')
        
        if text[(text.index(':') - 1) : text.index(':')] == ')' :
            self.insert(tk.INSERT, '\n\t')
    return

这是一个位于文本小部件中的函数,其中 init 附加了以下绑定:

self.bind('(', lambda x : self.autocomplete('('))
self.bind('{', lambda x : self.autocomplete('{'))
self.bind('[', lambda x : self.autocomplete('['))
self.bind(':', lambda x : self.autocomplete(':'))
self.bind('\'', lambda x : self.autocomplete('\''))
self.bind('\"', lambda x : self.autocomplete('\"'))

当我输入其中任何一个时,让我们以例如括号,然后它显示输出有点不正确。

)(

这也是相同的快照:

你看我想让另一个括号出现在最后但它没有。

这是因为绑定是在字符插入文本小部件之前触发的。要解决此问题,您可以改为绑定到“”,其中 .. 需要替换为 keysym。

self.bind('<KeyRelease-parenleft>', lambda x : self.autocomplete('('))
self.bind('<KeyRelease-braceleft>', lambda x : self.autocomplete('{'))
self.bind('<KeyRelease-bracketleft>', lambda x : self.autocomplete('['))
self.bind('<KeyRelease-colon>', lambda x : self.autocomplete(':'))
self.bind('<KeyRelease-apostrophe>', lambda x : self.autocomplete('\''))
self.bind('<KeyRelease-quotedbl>', lambda x : self.autocomplete('\"'))

所有特殊字符的键符并不总是相同 OS,所以这里有一个技巧可以找到您系统上任何键的键符:

import tkinter as tk
root = tk.Tk()
root.bind('<Key>', lambda ev: print(ev.keysym))
root.mainloop()

只需按下按键即可获取键码