鱼C论坛

 找回密码
 立即注册
查看: 1400|回复: 3

[已解决]关于tkinter模块的entry组件相关问题

[复制链接]
发表于 2020-8-21 16:38:16 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 gdmao002 于 2020-8-21 16:41 编辑

视频内容 P68 067GUI的终极选择:Tkinter4
在小甲鱼老师的视频中只是写了12345+54321=66666
然后呢 我写完了之后发现 一旦文本框的内容输入后至少会保留1位还是不可修改的那种
如下图

                               
登录/注册后可看大图

在图片上第一位数字一旦写完就无法删除,请教下大家这是为何?
或者说有什么办法 让输入的内容可以随意的数字而不是第一位固定不变的!

下面是我的代码

  1. import tkinter

  2. root = tkinter.Tk()
  3. root.title('我的计算')
  4. root.resizable(0, 0)

  5. frame = tkinter.Frame(root)
  6. frame.grid(padx=5, pady=5)

  7. v1 = tkinter.StringVar()
  8. v1.set('+')
  9. v2 = tkinter.StringVar()
  10. v2.set('=')

  11. l1 = tkinter.Label(frame, textvariable=v1).grid(row=1, column=2, padx=5, pady=5)
  12. l2 = tkinter.Label(frame, textvariable=v2).grid(row=1, column=4, padx=5, pady=5)


  13. def fun1(p):
  14.     return p.isdigit()


  15. def cal():
  16.     num = int(e1.get()) + int(e2.get())
  17.     v3.set(str(num))


  18. testCMD = root.register(fun1)
  19. e1 = tkinter.Entry(frame, width=10, validate='key', validatecommand=(testCMD, '%P'))
  20. e1.grid(row=1, column=1, padx=5, pady=5)
  21. e2 = tkinter.Entry(frame, width=10, validate='key', validatecommand=(testCMD, '%P'))
  22. e2.grid(row=1, column=3, padx=5, pady=5)
  23. v3 = tkinter.StringVar()
  24. e3 = tkinter.Entry(frame, textvariable=v3, state='readonly')
  25. e3.grid(row=1, column=5, padx=5, pady=5)

  26. tkinter.Button(frame, text='计算结果', command=cal).grid(row=2, column=3, padx=5, pady=5)
  27. root.mainloop()
复制代码
最佳答案
2020-8-21 16:47:53
本帖最后由 Twilight6 于 2020-8-21 16:50 编辑


改成这样就行,因为验证函数 p.isdigit() 必须要是纯数字字符串,而你删全空了是空字符串

isdigit 返回 False 所以无法删除最开始输入的字符

你把 return p.isdigit() 加上 or p == '' ,或者 not p 就行了:

  1. import tkinter

  2. root = tkinter.Tk()
  3. root.title('我的计算')
  4. root.resizable(0, 0)

  5. frame = tkinter.Frame(root)
  6. frame.grid(padx=5, pady=5)

  7. v1 = tkinter.StringVar()
  8. v1.set('+')
  9. v2 = tkinter.StringVar()
  10. v2.set('=')

  11. l1 = tkinter.Label(frame, textvariable=v1).grid(row=1, column=2, padx=5, pady=5)
  12. l2 = tkinter.Label(frame, textvariable=v2).grid(row=1, column=4, padx=5, pady=5)


  13. def fun1(p):
  14.     return p.isdigit() or p == ''


  15. def cal():
  16.     num = int(e1.get()) + int(e2.get())
  17.     v3.set(str(num))


  18. testCMD = root.register(fun1)
  19. e1 = tkinter.Entry(frame, width=10, validate='key', validatecommand=(testCMD, '%P'))
  20. e1.grid(row=1, column=1, padx=5, pady=5)
  21. e2 = tkinter.Entry(frame, width=10, validate='key', validatecommand=(testCMD, '%P'))
  22. e2.grid(row=1, column=3, padx=5, pady=5)
  23. v3 = tkinter.StringVar()
  24. e3 = tkinter.Entry(frame, textvariable=v3, state='readonly')
  25. e3.grid(row=1, column=5, padx=5, pady=5)

  26. tkinter.Button(frame, text='计算结果', command=cal).grid(row=2, column=3, padx=5, pady=5)
  27. root.mainloop()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-8-21 16:47:53 | 显示全部楼层    本楼为最佳答案   
本帖最后由 Twilight6 于 2020-8-21 16:50 编辑


改成这样就行,因为验证函数 p.isdigit() 必须要是纯数字字符串,而你删全空了是空字符串

isdigit 返回 False 所以无法删除最开始输入的字符

你把 return p.isdigit() 加上 or p == '' ,或者 not p 就行了:

  1. import tkinter

  2. root = tkinter.Tk()
  3. root.title('我的计算')
  4. root.resizable(0, 0)

  5. frame = tkinter.Frame(root)
  6. frame.grid(padx=5, pady=5)

  7. v1 = tkinter.StringVar()
  8. v1.set('+')
  9. v2 = tkinter.StringVar()
  10. v2.set('=')

  11. l1 = tkinter.Label(frame, textvariable=v1).grid(row=1, column=2, padx=5, pady=5)
  12. l2 = tkinter.Label(frame, textvariable=v2).grid(row=1, column=4, padx=5, pady=5)


  13. def fun1(p):
  14.     return p.isdigit() or p == ''


  15. def cal():
  16.     num = int(e1.get()) + int(e2.get())
  17.     v3.set(str(num))


  18. testCMD = root.register(fun1)
  19. e1 = tkinter.Entry(frame, width=10, validate='key', validatecommand=(testCMD, '%P'))
  20. e1.grid(row=1, column=1, padx=5, pady=5)
  21. e2 = tkinter.Entry(frame, width=10, validate='key', validatecommand=(testCMD, '%P'))
  22. e2.grid(row=1, column=3, padx=5, pady=5)
  23. v3 = tkinter.StringVar()
  24. e3 = tkinter.Entry(frame, textvariable=v3, state='readonly')
  25. e3.grid(row=1, column=5, padx=5, pady=5)

  26. tkinter.Button(frame, text='计算结果', command=cal).grid(row=2, column=3, padx=5, pady=5)
  27. root.mainloop()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-21 16:52:03 | 显示全部楼层
Twilight6 发表于 2020-8-21 16:47
改成这样就行,因为验证函数 p.isdigit() 必须要是纯数字字符串,而你删全空了是空字符串

isdigit 返 ...

感谢帮忙~

点评

客气了~  发表于 2020-8-21 16:54
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-25 22:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表