Python 3 Tkinter - 如何实施默认格式

时间:2016-03-04 16:43:47

标签: python tkinter

我正在编写我的第一个Python tkinter应用程序。

应用程序本身是一个xml编辑器。它将查找2个元素,并更新元素的文本值。下面的代码是概念验证,实际上并没有更新任何内容。

#!/usr/bin/env python

from tkinter import *
from tkinter import messagebox
import xml.etree.ElementTree as ET


class NameDropper(Frame):

    def __init__(self,fp=None):
        self.fp = fp
        #Create the Mainframe
        root = Tk()
        root.config(bg="red")
        root.title("NameDropper")
        mainframe = Frame(root, colormap="new")
        #mainframe.config(width=200,height=200,bg="green")

        # place and configure
        mainframe.grid(column=0,row=0,sticky=(N,W,E,S)) #makes Frame appear on screen
        #mainframe.columnconfigure(0, weight=1)
        #mainframe.rowconfigure(0, weight=1)

        self.mainframe = mainframe
        self.createVariables()
        self.createWidgets()
        self.gridWidgets()
        #self.mainframe.pack(fill=BOTH, expand=YES)

    def createVariables(self):
        self.start = StringVar()
        self.duration = StringVar()

    def createWidgets(self):
        self.mainframe.startLabel = Label(self.mainframe,text="Start",font=("Helvetica", 16))
        self.mainframe.startEntry = Entry(self.mainframe,textvariable=self.start,font=("Helvetica", 16))
        # self.mainframe.startLabel.pack(side="left", fill=None, expand=False)
        self.mainframe.durLabel = Label(self.mainframe,text="Duration",font=("Helvetica", 16))
        # self.mainframe.durLabel.pack(side="left", fill=None, expand=False)
        self.mainframe.durEntry =  Entry(self.mainframe,textvariable=self.duration,font=("Helvetica", 16))
        self.mainframe.saveButton = Button(self.mainframe, text='Save', command=self.save)
        self.mainframe.quitButton = Button(self.mainframe,text='Quit',command=self.mainframe.quit)

    def gridWidgets(self):
        self.mainframe.startLabel.grid(column=0,row=0,sticky=(N,W))
        # self.mainframe.startLabel.config(bg="red")
        self.mainframe.startEntry.grid(column=1,row=0,sticky=(N,W))
        # self.mainframe.startEntry.config(bg="black")
        self.mainframe.durLabel.grid(column=0,row=1,sticky=(N,W))
        self.mainframe.durEntry.grid(column=1,row=1,sticky=(N,W))
        self.mainframe.saveButton.grid(column=0,row=3,sticky=SW)
        self.mainframe.quitButton.grid(column=2,row=3,sticky=SE)

    def save(self):
        root = ET.parse(fp).getroot()
        generic_anc_enable = root.findall('GenericANCEnable')
        for item in generic_anc_enable:
            start_element = item.find('StartTimecode')
            duration_element = item.find('DurationTimecode')
            start_element.text = str(self.mainframe.startEntry.get())
            duration_element.text = str(self.mainframe.durEntry.get())


            messagebox.showwarning(start_element.text)

if __name__ == '__main__' :
    fp = "C:\\Users\\206420055\\Documents\\VancInsertionLabelTdyShwCrwlTC.xml"
    app = NameDropper(fp)

    app.mainframe.mainloop()

我的问题是,有没有办法屏蔽Entry字段,以便它们自动且始终遵循某种格式?

enter image description here

目标是让两个标签自动遵循格式xx:yy:zz;nn

我之前在一年前用Java构建了这个应用程序,但是新的要求使我摆脱了Java。

去年八月关于Java版本的原始问题就在这里 Java - Enforce TextField Format - UX - 00:00:00;00

我还没有找到任何关于强制执行格式的文档

2 个答案:

答案 0 :(得分:0)

条目小部件没有内置功能。所有基本构建模块都可以使用,但您必须自己完成大部分工作。

一个简单的解决方案是使用四个条目小部件(对于xx,yy,zz和nn)和三个标签(对于冒号)。为了获得更好的效果,您可以设置自定义绑定,以便在用户键入时自动插入冒号。

您还可以使用条目小部件验证功能简单地拒绝任何不以正确格式生成字符串的字符。

答案 1 :(得分:0)

在Flask-wtforms中,有一个验证想法可以在这里应用;使用正则表达式检查输入是否符合特定条件。如果输入的数据与您选择的给定格式不匹配,只需拒绝该提交并向用户提供有用的信息即可。

import re

start_time = re.compile(r'^(([01]\d|2[0-3]):([0-5]\d)|24:00)$')
duration = re.compile('[0-9]{2}:[0-9]{2}:[0-9]{2};[0-5]{1}[0-9]{1}')


if start_time.match(user_input_var):
    add_well_formatted_data()
else:
    print('please format the data accordingly:  xx,yy,zz,nn')

if duration.match(user_input_var):
    add_well_formatted_data()
else:
    print('please format the data accordingly:  xx,yy,zz,nn')

或者,您不需要正则表达式,因为datetime类中有格式验证器。