python - 如何通过阻止输入的最新字符来限制 python 中 tkinter 文本小部件的长度?
问题描述
我试图以一种非常具体的方式限制 Python 中 tkinter 文本小部件或条目小部件(任何一种小部件类型都可以)中的字符数量。我有一个带有接近文本小部件的解决方案:
string = self.text.get("1.0","end-1c")
if len(string) >= 5:
self.text.delete('1.0', "end-1c")
string = string[:-1]
self.quantity_entry.insert(END, string)
但是上面的代码执行以下操作:如果我输入 123456,它会将内容转换为 12346。它会删除现有字段的最后一个字符 (5),然后将输入的最后一个字符 (6) 放在末尾。所以它变成了12346。
我想要的是 12345 保持 12345,这意味着现有的 12345 字符串应该保持原样,并且任何新字符都会被有效地阻止被附加。有没有办法做到这一点?
我尝试使用:
self.text.configure(state="disabled")
这确实阻止了后续字符的插入,因此 12345 保持为 12345。但这会锁定该字段以防将来编辑。即使随后尝试使用:
self.text.configure(state="normal")
该字段保持锁定。如果用户达到五个字符的限制,我希望用户能够编辑该字段。
谢谢你。
解决方案
跟踪变量会更整洁。然后它甚至不会在屏幕上短暂闪烁。你可以像这样打包成一个整洁的子类:
import tkinter as tk
class Lotfi(tk.Entry):
def __init__(self, master=None, max_len=5, **kwargs):
self.var = tk.StringVar()
self.max_len = max_len
tk.Entry.__init__(self, master, textvariable=self.var, **kwargs)
self.old_value = ''
self.var.trace('w', self.check)
def check(self, *args):
if len(self.get()) <= self.max_len:
self.old_value = self.get() # accept change
else:
self.var.set(self.old_value) # reject change
#demo code:
window = tk.Tk()
ent=Lotfi(window, max_len=5)
ent.pack()
window.mainloop()
推荐阅读
- php - 我如何用 laravel eloquent 编写这个查询
- filter - ODOO 10 如何根据发货作业线过滤发货订单?
- javascript - 将 ASP.NET MVC Web 应用程序从 http 转换为 https
- python - 如何拆分字符串并指定为熊猫数据框的列名?
- python - 是否可以对 python2 和 python3 使用相同的 pipenv?
- prestashop - Prestashop 管理面板访问问题
- jquery - 使用引导程序自定义上下文菜单位置
- mysql - Siteground 托管到 AWS RDS 连接花费了太多时间
- typescript - Typescript:可以使用枚举作为函数参数类型吗?
- java - 无法使用 selenium 在离子输入中找到 textarea 元素