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

问题描述

我一直在开发一个应用程序,在该应用程序中我想自动完成诸如方括号圆形卷曲正方形之类的内容。我使用tkinter的insert方法,将document.querySelectorAll(".like-btn").forEach(el => el.addEventListener("click",() => { count++ el.innerText = count console.log(el) })) 常量作为索引,如下所示:

tk.INSERT

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

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

当我键入任何类似的内容时,例如括号,然后显示输出有些不正确。

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('\"'))

这里也是相同的快照:

The text widget's actual snapshot of the problem


您看到我希望另一个括号出现在末尾,但不要出现。

解决方法

这是因为绑定是在将字符插入文本小部件之前触发的。要解决此问题,您可以绑定到“ ”,而..需要用键盘符号代替。

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('\"'))

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

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

只需按键就可以得到按键符号