当前位置: 首页 > 面试题库 >

Tkinter:设置StringVar之后 事件,包括按下的键

倪子晋
2023-03-14
问题内容

每次将字符输入到Text窗口小部件时,我都希望获取该窗口小部件的内容,并从某个数字中减去其长度(基本上是“剩下x个字符”)。

但是,StringVar()这始终是背后的事件。根据我的收集,这是因为在字符输入到“文本”小部件中之前已处理了事件。这意味着,如果我在该字段中输入StringVar3个字符,然后输入第4个字符,则该字符将被更新,但仍为3个字符长,那么当我输入第5个字符时,它将更新为4个字符。

有没有办法使两者保持一致?

这是一些代码。我删除了无关的部分。

def __init__(self, master):
    self.char_count = StringVar()
    self.char_count.set("140 chars left")

    self.post_tweet = Text(self.master)
    self.post_tweet.bind("<Key>", self.count)
    self.post_tweet.grid(...)

    self.char_count = Label(self.master, textvariable=self.foo)
    self.char_count.grid(...)

def count(self):
    self.x = len(self.post_tweet.get(1.0, END))
    self.char_count.set(str(140 - self.x))

问题答案:

一个简单的解决方案是在类绑定之后添加新的bindtag。这样,类绑定将在绑定之前触发。见这个答案的问题如何Tkinter的文本小部件绑定自事件发生后,将通过文本控件绑定?举个例子
该答案使用输入小部件而不是文本小部件,但是绑定标记的概念在这两个小部件之间是相同的。只要确保使用Text而不是Entry适当的地方即可。

另一个解决方案是在KeyRelease上进行绑定,因为默认绑定发生在KeyPress上。

这是显示如何使用绑定标签的示例:

import Tkinter as tk

class Example(tk.Frame):
    def __init__(self, master):
        tk.Frame.__init__(self, master)

        self.post_tweet = tk.Text(self)
        bindtags = list(self.post_tweet.bindtags())
        bindtags.insert(2, "custom") # index 1 is where most default bindings live
        self.post_tweet.bindtags(tuple(bindtags))

        self.post_tweet.bind_class("custom", "<Key>", self.count)
        self.post_tweet.grid()

        self.char_count = tk.Label(self)
        self.char_count.grid()

    def count(self, event):
        current = len(self.post_tweet.get("1.0", "end-1c"))
        remaining = 140-current
        self.char_count.configure(text="%s characters remaining" % remaining)

if __name__ == "__main__":
    root = tk.Tk()
    Example(root).pack(side="top", fill="both", expand=True)
    root.mainloop()


 类似资料:
  • 本文向大家介绍Python tkinter之Bind(绑定事件)的使用示例,包括了Python tkinter之Bind(绑定事件)的使用示例的使用技巧和注意事项,需要的朋友参考一下 1、绑定鼠标事件并获取事件属性 2、绑定键盘事件并获取事件属性 以上就是Python tkinter之Bind(绑定事件)的使用示例的详细内容,更多关于python tkinter Bind(绑定事件)的资料请关注呐

  • 在 imi 中,使用模型关联时,提供了监听前置和后置事件的方法,让开发者可以更加灵活地做一些自定义处理。 事件 插入事件 前置事件名: IMI.MODEL.RELATION.INSERT.模型类名.模型属性名.BEFORE 后置事件名: IMI.MODEL.RELATION.INSERT.模型类名.模型属性名.AFTER 事件参数: 参数名 类型 描述 model string 模型类名 prop

  • 问题内容: 我有以下功能,用于页面修饰,仅在加载所有图像后才显示: 问题在于缓存的图像无法触发事件,因此不能减小缓存的图像。 我知道我需要实施NickCraver的解决方案,但不确定如何实现。谁能帮我? 问题答案: 好的,设法将它们合并: 注意:带有404像素的图片会破坏此效果。

  • 主要内容:事件绑定方法,常用事件类型,Event事件对象事件处理,是 GUI 程序中不可或缺的重要组成部分,相比来说,控件只是组成一台机器的零部件, 而事件处理则是驱动这台机器“正常”运转的关键所在,它能够将零部件之间“优雅”的贯穿起来,因此“事件处理”可谓是 GUI 程序的“灵魂”,同时它也是实现人机交互的关键。 对于“事件”这一名词,在讲解控件时也偶尔提及过,在本节我们将对 Tkinter 中的事件处理机制做更为详细的介绍。 在一款 GUI 程序中

  • Button 控件是 Tkinter 中常用的窗口部件之一,同时也是实现程序与用户交互的主要控件。通过用户点击按钮的行为来执行回调函数,是 Button 控件的主要功用。首先自定义一个函数或者方法,然后将函数与按钮关联起来,最后,当用户按下这个按钮时,Tkinter 就会自动调用相关函数。 按钮控件使用起来非常简单,它同样可以包含文本、图像、位图,并通过 参数回调函数。当然按钮也并非一定要执行回调

  • 我正在尝试使用Python创建一个简单的Tkinter GUI。用户界面有3个不同的按钮:是、否和打印。 如果用户单击“是”,然后单击“打印”,将出现一行“是1”。 如果用户取消单击“是”,然后单击“否”,然后单击“打印”,则会出现一行“否为0”。 但是程序怎么能够跟踪用户点击哪个按钮呢?我可以用哪个功能来找到这两个相关按钮之间的联系?代码是如何执行的? 太感谢你了!