|

楼主 |
发表于 2021-12-29 16:43:59
|
显示全部楼层
经过各位大佬的指点,搞出来了一个这样的东西:
- import tkinter as tk
- # root window
- root = tk.Tk()
- root.geometry('300x200')
- root.resizable(False, False)
- root.title('Spinbox Demo')
- val = tk.StringVar()
- e = tk.Entry(root, textvariable=val)
- e.pack()
- val1 = tk.StringVar()
- e1 = tk.Entry(root, textvariable=val1)
- e1.pack()
- def copy(event):
- print('copy')
- def paste(event):
- print('paste')
- def test(event): # 检测用户输入
- print('event.char:', event.char)
- print('event.keycode:', event.keycode)
- print('event.keysym:', event.keysym)
- print('---')
- # print(e.focus_get())
- # print(type(e.focus_get()))
- del_char(event)
- def del_char(event):
- if (text := str(val.get())).isdigit() == False and str(e.focus_get()) == '.!entry': # 输入不为数值.则删除最后一位
- # print(val.get())
- val.set("".join(i for i in text if i.isdigit()))
- root.bind('<Key>', test) # 调用检测用户输入的函数
- '''
- root.bind('<Control-c>', copy)
- root.bind('<Control-v>', paste)
- root.bind('<Control-Cyrillic_em>', paste)
- '''
- e.bind('<Command-c>', lambda e: 'break')
- e.bind('<Command-v>', lambda e: 'break')
- e.bind('<Control-c>', lambda e: 'break')
- e.bind('<Control-v>', lambda e: 'break')
- root.mainloop()
复制代码
如果只是单一只有一个 Entry 的话,倒是不需要判定现在是在哪个 entry 框输入的.判断 entry 框的原因是因为存在多个 entry 框,并且不是每一个 entry 框都限定了只能输入数字.光凭这一点的话,远没有大佬们的代码优秀
尝试过将 bind key 绑定在 e 上 (指定的一个 entry 框),但是存在不小的问题,因为这时候进行的 get,get 获取的内容是不包含当前即将判断的这个字符的,但是 event 这里指向的是当前输入的那个字符的.例如我输入一个字符 'e', get 到的是一个空字符串,而非 'e',但是 event 那里获取到的是我输入了一个'e',进而进入 if 判断,判断结束后,会删除 val 里面的最后一个字符,再将这个 'e' 放到 val 的末端
此处感谢上面的一位大佬提出的一种特殊情况,即为复制粘贴,此处采取了暴力手段,禁止了复制粘贴的使用 |
|