Python:tkinter 搭建简易前端,含:栏位校验、附件、Canvas图片切换

最近在学习tkinter,碰巧老婆学校需要一个考场分布系统,就做了一个,中间遇到了很多问题,有些网上资料零碎,我就把前端代码(屏蔽了一些敏感栏位)贴出来,仅供参考。

需求:录入一些内容、附件,根据内容、附件等信息,结合实际情况,生成考场分布,成功显示笑脸,失败显示哭脸(提示信息 略)。

  1. 栏位校验在L115,规则是L9
  2. Canvas图片切换在L64
  3. 附件在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()


在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值