Tkinter: создать идентификационный код из пользовательского ввода - PullRequest
1 голос
/ 10 апреля 2020

Я новичок в использовании python и tkinter, и я застрял с моим сценарием, вот таким:

from openpyxl import *
from tkinter import *


wb = load_workbook('C:\\Users\\Me\\Desktop\\Script\\try.xlsx') 

sheet = wb.active 


def excel(): 

    sheet.cell(row=1, column=1).value = "name"
    sheet.cell(row=1, column=2).value = "birth"
    sheet.cell(row=1, column=3).value = "gender"
    sheet.cell(row=1, column=4).value = "mobile"



def focus1(event): 
    birth_field.focus_set() 


def focus2(event): 
    gender_field.focus_set() 


def focus3(event): 
    mobile_field.focus_set() 


def clear():    
    name_field.delete(0, END) 
    birth_field.delete(0, END) 
    gender_field.delete(0, END)
    mobile_field.delete(0, END)

def insert(): 
    if (fame_field.get() == "" and
        birth_field.get() == "" and
        gender_field.get() == "" and
        mobile_field.get() == ""):

        print("empty input") 

    else: 
        current_row = sheet.max_row 
        current_column = sheet.max_column 

        sheet.cell(row=current_row + 1, column=1).value = name_field.get() 
        sheet.cell(row=current_row + 1, column=2).value = birth_field.get() 
        sheet.cell(row=current_row + 1, column=3).value = gender_field.get() 
        sheet.cell(row=current_row + 1, column=4).value = mobile_field.get() 


        wb.save('C:\\Users\\Me\\Desktop\\Script\\try.xlsx') 

        name_field.focus_set() 

        clear() 


if __name__ == "__main__": 

 root = Tk() 

root.configure(background='light grey') 

root.geometry("500x300") 

excel()
#label
name = Label(root, text="name", bg="light grey") 

birthdate = Label(root, text="birthdate", bg="light grey")

gender = Label(root, text="gender", bg="light grey")

mobile = Label(root, text="mobile contact", bg="light grey") 

#grid
name.grid(row=1, column=0, sticky=W) 
birthdate.grid(row=2, column=0, sticky=W) 
gender.grid(row=3, column=0, sticky=W) 
mobile.grid(row=4, column=0, sticky=W) 

#entry
name_entry = Entry(root) 
birthdate_entry = Entry(root) 
gender_entry = StringVar()
mobile_entry = Entry(root) 


name_entry.bind("<Return>", focus1) 


birthdate_entry.bind("<Return>", focus2) 


gender_entry.bind("<Return>", focus4) 


mobile_entry.bind("<Return>", focus5) 


name_entry.grid(row=1, column=1, ipadx="100") 
birthdate_entry.grid(row=2, column=1, ipadx="100") 
gender_entry.grid(row=3, column=1, ipadx="100") 
mobile_entry.grid(row=4, column=1, ipadx="100") 


excel() 

submit = Button(root, text="Submit", fg="White", 
                            bg="Red", command=insert) 
submit.grid(row=12, column=1) 

root.mainloop() 

Мне нужно создать код из пользовательского ввода, например так: первые две буквы имени, плюс год рождения, возраст (который мне нужно рассчитать по дате рождения) и последние две цифры мобильного телефона разделяются на «_» (например, na_2000_20_99). Я хотел бы, чтобы он появился в текстовом клине, который пользователь может видеть, но не мог редактировать, а затем сохранить его в моем файле Excel. Является ли это возможным? Также мой первый выбор для пола был использовать Radiobutton, но по какой-то причине он заставляет меня ошибаться, и поэтому я сохранил текстовую форму. Если кто-то может помочь с моими проблемами, я буду очень благодарен. Всем спасибо и хорошего дня!

1 Ответ

0 голосов
/ 10 апреля 2020

У вашей программы были ошибки при выполнении. Попробуйте следующий код. Дата рождения должна быть в формате ГГГГ-ММ-ДД.

from openpyxl import *
from tkinter import *
from datetime import datetime
from dateutil.relativedelta import relativedelta

wb = load_workbook('C:\\Users\\Me\\Desktop\\Script\\try.xlsx') 

sheet = wb.active
datetimeFormat = '%Y-%m-%d'
class Mainframe(Frame):
    # Mainframe contains the widgets
##    global inv_cnt
    def __init__(self,master,*args,**kwargs):
        global msg, inv_cnt
        excel()
        inv_cnt=1
        # *args packs positional arguments into tuple args
        # **kwargs packs keyword arguments into dict kwargs

        # initialise base class
        Frame.__init__(self,master,*args,**kwargs)
        # in this case the * an ** operators unpack the parameters

        name = Label(self, text="Name:", font=('times', 15),anchor='e').place(relx=0.05, rely=0.05, height=15, width=100)
        birthdate = Label(self, text="Birth Date:", font=('times', 15),anchor='e').place(relx=0.05, rely=0.15, height=15, width=100)
        gender = Label(self, text="Gender:", font=('times', 15),anchor='e').place(relx=0.05, rely=0.25, height=15, width=100)
        mobile = Label(self, text="Mobile:", font=('times', 15),anchor='e').place(relx=0.05, rely=0.35, height=15, width=100)

        self.name = StringVar(self)
        self.name.set('')
        self.name=Entry(self,textvariable = self.name, width=280, bg='WHITE')
        self.name.place(relx=0.2, rely=0.05, height=25, width=100)

        self.birthdate = StringVar(self)
        self.birthdate.set('')
        self.birthdate=Entry(self,textvariable = self.birthdate, width=280, bg='WHITE')
        self.birthdate.place(relx=0.2, rely=0.15, height=25, width=100)

        self.gender = StringVar(self)
        self.gender.set('')
        self.gender=Entry(self,textvariable = self.gender, width=280, bg='WHITE')
        self.gender.place(relx=0.2, rely=0.25, height=25, width=100)

        self.mobile = StringVar(self)
        self.mobile.set('')
        self.mobile=Entry(self,textvariable = self.mobile, width=280, bg='WHITE')
        self.mobile.place(relx=0.2, rely=0.35, height=25, width=100)

        # Proceed button
        self.Submit = Button(self, text='Submit', fg="White", 
                            bg="Red", command=self.insert)
        self.Submit.place(relx=0.05,rely=0.50,height=25,width=100)

        self.Output = StringVar(self)
        self.Output.set('')
        self.Output1 = Label(self, textvariable=self.Output, font=('times', 10),anchor='e', bg='WHITE').place(relx=0.05, rely=0.70, height=15, width=200)

        self.name.bind("<Return>", self.focus1) 


        self.birthdate.bind("<Return>", self.focus2) 


        self.gender.bind("<Return>", self.focus3) 

    def focus1(self, event): 
        self.birthdate.focus_set() 


    def focus2(self, event): 
        self.gender.focus_set() 


    def focus3(self, event): 
        self.mobile.focus_set() 


    def get_inv_count(self,value):
        global inv_cnt
        inv_cnt = value 


    def clear(self):    
        self.name.delete(0, END) 
        self.birthdate.delete(0, END) 
        self.gender.delete(0, END)
        self.mobile.delete(0, END)

    def insert(self):
        print(self.name.get(), self.birthdate.get(), self.gender.get(), self.mobile.get())
        if (self.name.get() == "" and
            self.birthdate.get() == "" and
            self.gender.get() == "" and
            self.mobile.get() == ""):

            print("empty input") 

        else: 
            current_row = sheet.max_row 
            current_column = sheet.max_column 

            sheet.cell(row=current_row + 1, column=1).value = self.name.get() 
            sheet.cell(row=current_row + 1, column=2).value = self.birthdate.get() 
            sheet.cell(row=current_row + 1, column=3).value = self.gender.get() 
            sheet.cell(row=current_row + 1, column=4).value = self.mobile.get()
            difference_in_years = relativedelta(datetime.strptime(datetime.now().strftime(datetimeFormat), datetimeFormat),
                                                datetime.strptime(self.birthdate.get(), datetimeFormat)).years
            self.Output.set("{0}_{1}_{2}_{3}".format(self.name.get()[:2], self.birthdate.get()[:4], difference_in_years, self.mobile.get()[-2:]))
            wb.save('try.xlsx') 

            self.name.focus_set() 

            self.clear() 

def excel(): 

    sheet.cell(row=1, column=1).value = "name"
    sheet.cell(row=1, column=2).value = "birth"
    sheet.cell(row=1, column=3).value = "gender"
    sheet.cell(row=1, column=4).value = "mobile"


class App(Tk):
    def __init__(self):
        global value
        Tk.__init__(self)
        self.title("MY GUI")
        self.geometry('800x250')
        self.resizable(0,0)
                # create and pack a Mainframe window
        Mainframe(self).place(x=0,y=0,height=250,width=800)
        self.mainloop()       

App()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...