Ror*_*rne 6 python tkinter text-widget
每次将一个角色输入一个Text小部件时,我想获取该小部件的内容并从某个数字中减去它的长度(基本上是"你有x个字符剩下的"交易).
但StringVar()总是落后于一件事.这是我收集的内容,因为在将字符输入到Text小部件之前处理了该事件.这意味着如果我在该字段中有3个字符并且我输入第4个,StringVar则更新但仍然是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))
Run Code Online (Sandbox Code Playgroud)
一个简单的解决方案是在类绑定之后添加一个新的绑定标签。这样,类绑定将在您的绑定之前触发。请参阅以下问题的答案:How to bind self events in Tkinter Text widget after it will be linked by Text widget? 举个例子。该答案使用条目小部件而不是文本小部件,但是绑定标签的概念在这两个小部件之间是相同的。只是一定要在适当的地方使用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()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2580 次 |
| 最近记录: |