最近在学习tkinter,碰巧老婆学校需要一个考场分布系统,就做了一个,中间遇到了很多问题,有些网上资料零碎,我就把前端代码(屏蔽了一些敏感栏位)贴出来,仅供参考。
需求:录入一些内容、附件,根据内容、附件等信息,结合实际情况,生成考场分布,成功显示笑脸,失败显示哭脸(提示信息 略)。
- 栏位校验在L115,规则是L9
- Canvas图片切换在L64
- 附件在L123
#-*- encoding=UTF-8 -*-
__author__ = 'daniu'
import tkinter as tk
from tkinter import filedialog
from tkinter import messagebox
from PIL import Image, ImageTk
'''
开启Entry对输入文本验证功能。
1、实现该功能,需要通过设置validate、validatecommand和invalidcommand三个选项。
2、启用验证的开关是validate选项,该选项可以设置以下的值:
focus:当entry组件获得或者失去焦点的时候验证
focusin:当entry组件获得焦点的时候验证
focusout:当entry组件失去焦点的时候验证
key:当输入框被编辑的时候验证
all:当出现上面任何一种情况时候验证
none:关闭验证功能。默认设置为该选项
3、validatecommand选项指定一个验证函数,该函数只能返回True或者False表示验证结果,一般情况下验证函数只需要知道输入框中的内容即可,
可以通过Entry组件的get()方法来获得该字符串。
4、invalidcommand选项指定的函数只有在validatecommand的返回值为False的时候才被调用。
Tkinter 为验证函数提供了一些隐藏的功能选项。
%d:操作代码-0表示删除操作,1表示插入操作,2表示获得、失去焦点或textvariable变量值被修改
%i:1、当用户尝试插入或删除操作时候,该选项表示插入或删除的位置(索引号)
2、如果是获得、失去焦点或textvariable变量值被修改该而地啊哟用验证函数,那么该值是-1
%P: 1、当输入框的值允许改变的时候,该值有效
2、该值为输入框的最新文本内容
%s: 1、该值为调用验证函数前输入框的文本内容
%S:1、当插入或删除操作出发验证函数的时候,该值有效
2、该选项表示文本被插入和删除的内容
%v: 1、该组件的validate选项的值
%V: 1、调用验证函数的原因
2、该值是focusin,focusout,ke,或forced(textvariable选项指定的变量值被修改)中的一个
%W: 该组件的名称
为了使用这些选项,我们可以这样修改我们的validatecommand选项:
validatecommand=(f,s1,s2,……)
其中,f是验证函数名,s1,s2等是额外的选项,这些选项会作为参数依次传给f函数,常用的为:validatecommand=(funName,'%P','%v','%W')
我们在使用隐藏的功能选项前需要冷却,这就是register()方法将验证函数包装起来。
'''
def checkNameEntry(nameValue, validOption, fieldName):
# 案例简单,暂时无校验
return True
def checkNameEntryInvalid():
print('nameEntry 不合法时执行')
def selFile():
path_ = filedialog.askopenfilename()
fileEntryV.set(path_)
def createExam():
# 1、检查栏位
if checkAllField():
# 使用计数器模拟后台返回,奇数 失败,偶数成功
global img
global image
global testnum
if testnum % 2 == 0:
image = Image.open('../res/img/png/smile.png')
img = ImageTk.PhotoImage(image)
canvas1.create_image(10, 10, image=img, anchor="nw")
else:
image = Image.open('../res/img/png/cry.png')
img = ImageTk.PhotoImage(image)
canvas1.create_image(10, 10, image=img, anchor="nw")
testnum = testnum + 1
# 栏位检查
def checkAllField():
name = name_entry.get()
file = file_entry.get()
if name == '':
messagebox.showwarning('警告', '请录入内容')
return False
else:
if file == '':
messagebox.showwarning('警告', '请选择附件')
return False
return True
############### 页面 ########################
win = tk.Tk()
win.title("CSDN img")
win.geometry("800x400")
fileEntryV = tk.StringVar()
frame1 = tk.Frame(win)
frame1.pack()
frame2 = tk.Frame(win)
frame2.pack()
image = None
img = None
testnum = 1 # 计数器
canvas1 = tk.Canvas(frame2, height=200, width=200)
canvas1.pack()
nameEntryCMD = frame1.register(checkNameEntry)
name_label = tk.Label(frame1, text="内容")
name_label.grid(row=0, column=0, sticky=tk.W)
name_entry = tk.Entry(frame1, width=50, validate='focusout', validatecommand=(nameEntryCMD,'%P','%v','%W'),
invalidcommand=checkNameEntryInvalid)
name_entry.grid(row=0, column=1, sticky=tk.E)
name_entry.focus()
file_label = tk.Label(frame1, text="附件")
file_label.grid(row=1, column=0, sticky=tk.W)
file_entry = tk.Entry(frame1, textvariable=fileEntryV, state="disabled", width=50)
file_entry.grid(row=1, column=1, sticky=tk.E)
file_sel_btn = tk.Button(frame1, text="选择", command=selFile)
file_sel_btn.grid(row=1, column=2)
btn = tk.Button(frame1, text="发送后台处理", command=createExam)
btn.grid(row=3, column=1)
win.mainloop()