python 我无法使用键盘滚动Text标签的文本-Tkinter

s3fp2yjn  于 2022-12-17  发布在  Python
关注(0)|答案(1)|浏览(130)

我基本上已经从Text小部件中删除了不需要的字符,但是当我点击换行符并尝试使用键盘或鼠标滚动文本时,我就是做不到(它总是停留在同一个位置)。

class NewNewsFrame(Frame):
    def __init__(self, parent):
        self.Parent = parent
        self.initializecomponents()
        pass

    def validate_text(self, widger):
        value = widger.get("1.0", "end-1c")
        print value.fon
        if not value.isalnum():
            var = str()
            for i in value:
                print(f"({i})")
                var += i if(i.isalpha() or i.isdigit() or i == "(" or i == ")" or i == " " or i == "," or i == "." or i == "\n")else ""
            widger.delete("1.0", "end-1c")
            widger.insert("end-1c", var)
        pass

    def initializecomponents(self):
        Frame.__init__(self, self.Parent)

        self.DescriptionLabel = Label(self)
        self.DescriptionBox = Text(self)

        # DescriptionLabel
        self.DescriptionLabel.config(text="Description of the news:",bg=self["bg"], fg="#FFFFFF", font="none 15",anchor="nw")
        self.DescriptionLabel.place(relwidth=1, relheight=0.1, relx=0, rely=0.11, anchor="nw")

        # DescriptionBox
        self.DescriptionBox.bind("<KeyPress>", lambda event: self.validate_text(self.DescriptionBox))
        self.DescriptionBox.bind("<FocusOut>", lambda event: self.validate_text(self.DescriptionBox))

        self.DescriptionBox.place(relheight=0.4, relwidth=1, relx=0, rely=0.16, anchor="nw")
    pass

我尝试了解键盘滚动的工作原理,但我仍然不知道如何操作

6qftjkof

6qftjkof1#

问题是你每次按键都会删除和恢复所有的文本,这会导致光标位置以意想不到的方式改变,破坏默认的绑定。
如果你想阻止某些字符被输入,有一个更好的方法。如果你的验证函数返回字符串“break”,这就阻止了字符被插入。你不必重新扫描整个内容或删除并恢复文本,因为错误的字符从来没有在第一时间被输入。
您的验证函数可能如下所示:

def validate_text(self, event):
    if event.char.isalpha() or event.char.isdigit() or event.char in "() ,.\n":
        pass
    else:
        return "break"

接下来,将绑定简化为如下所示,Tkinter会自动将event参数传递给函数。

self.DescriptionBox.bind("<KeyPress>", self.validate_text)

这将打破您的<FocusOut>绑定,但我不确定是否需要它。
有关如何处理事件以及为什么返回“break”执行此操作的详细信息,请参阅问题Basic query regarding bindtags in tkinter的答案。该问题是关于Entry小部件的,但所有小部件的概念都相同。

相关问题