gdmao002 发表于 2020-8-21 16:38:16

关于tkinter模块的entry组件相关问题

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

视频内容 P68 067GUI的终极选择:Tkinter4
在小甲鱼老师的视频中只是写了12345+54321=66666
然后呢 我写完了之后发现 一旦文本框的内容输入后至少会保留1位还是不可修改的那种
如下图
https://s1.ax1x.com/2020/08/21/dt4NLQ.jpg
在图片上第一位数字一旦写完就无法删除,请教下大家这是为何?
或者说有什么办法 让输入的内容可以随意的数字而不是第一位固定不变的!

下面是我的代码

import tkinter

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

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

v1 = tkinter.StringVar()
v1.set('+')
v2 = tkinter.StringVar()
v2.set('=')

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


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


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


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

tkinter.Button(frame, text='计算结果', command=cal).grid(row=2, column=3, padx=5, pady=5)
root.mainloop()

Twilight6 发表于 2020-8-21 16:47:53

本帖最后由 Twilight6 于 2020-8-21 16:50 编辑


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

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

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

import tkinter

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

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

v1 = tkinter.StringVar()
v1.set('+')
v2 = tkinter.StringVar()
v2.set('=')

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


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


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


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

tkinter.Button(frame, text='计算结果', command=cal).grid(row=2, column=3, padx=5, pady=5)
root.mainloop()

gdmao002 发表于 2020-8-21 16:52:03

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

isdigit 返 ...

感谢帮忙~
页: [1]
查看完整版本: 关于tkinter模块的entry组件相关问题