Openpyxl сохранение закороченного файла, android - PullRequest
0 голосов
/ 07 февраля 2020

Я сделал код tkinter для сохранения персонала в файл xlsx, программа работает на моем компьютере, но когда я запускаю его на своем телефоне с помощью pydroid3, код запускается без проблем, но файл поврежден и не работает работа.

У кого-нибудь есть идея? Я думаю, проблема в том, что wb.save('file.xlsx') сохраняет файл в поврежденной форме.

Код:

from _tkinter import *
import tkinter as tk
from openpyxl import load_workbook
from datetime import datetime
wb = load_workbook('file.xlsx')
sheet = wb.active
ht = 500
wt = 500
root = tk.Tk()
var = tk.StringVar()
var.set(datetime.date(datetime.now()))
def call():
    n = 4
    j = d.get() + " 00:00:00"
    while True:
        a1 = sheet.cell(row=n, column=2)
        if j == str(a1.value):
            break
        n = n + 1
    p1 = sheet.cell(row=n, column=3)
    p1.value = e2.get()
    c1 = sheet.cell(row=n, column=4)
    c1.value = e6.get()
    m1 = sheet.cell(row=n, column=5)
    m1.value = e1.get()
    E1 = sheet.cell(row=n, column=7)
    E1.value = e4.get()
    D1 = sheet.cell(row=n, column=8)
    D1.value = e5.get()
    a1 = sheet.cell(row=n, column=9)
    a1.value = e3.get()
    t1 = sheet.cell(row=n, column=11)
    t1.value = e7.get()
    f1 = sheet.cell(row=n, column=6)
    f1.value = e8.get()

w = tk.Canvas(root, height= ht, width= wt)
w.pack()
frame= tk.Frame(root,bg='#3363F9')
frame.place(relwidth=1,relheight=1)
d = tk.Entry(frame,textvariable=var)
d.place(relx=0.6,rely=0.15)
# sc = tk.Label(frame,textvariable=var)
# sc.place(relx=0.4,rely=0.1)
s1 = tk.Label(frame,text="math")
s1.place(relx=0.15,rely=0.25)
e1 = tk.Entry(frame)
e1.place(relx=0.35,rely=0.25)
s2 = tk.Label(frame,text="physics")
s2.place(relx=0.15,rely=0.30)
e2 = tk.Entry(frame)
e2.place(relx=0.35,rely=0.30)
s3 = tk.Label(frame,text="arabic")
s3.place(relx=0.15,rely=0.35)
e3 = tk.Entry(frame)
e3.place(relx=0.35,rely=0.35)
s4 = tk.Label(frame,text="English")
s4.place(relx=0.15,rely=0.4)
e4 = tk.Entry(frame)
e4.place(relx=0.35,rely=0.4)
s5 = tk.Label(frame,text="German")
s5.place(relx=0.15,rely=0.45)
e5 = tk.Entry(frame)
e5.place(relx=0.35,rely=0.45)
s6 = tk.Label(frame,text="Chemistry")
s6.place(relx=0.15,rely=0.5)
e6 = tk.Entry(frame)
e6.place(relx=0.35,rely=0.5)
s7 = tk.Label(frame,text="transportion")
s7.place(relx=0.15,rely=0.55)
e7 = tk.Entry(frame)
e7.place(relx=0.35,rely=0.55)
s8 = tk.Label(frame,text="food")
s8.place(relx=0.15,rely=0.6)
e8 = tk.Entry(frame)
e8.place(relx=0.35,rely=0.6)
b = tk.Button(frame,text="get",command= lambda :call())
b.place(relx=0.75,rely=0.2)

root.mainloop()
wb.save('file.xlsx')

1 Ответ

0 голосов
/ 08 февраля 2020

Я немного почистил ваш код и протестировал. Никакой коррупции на моем конце. Дайте мне знать, если это поможет.

1-й мы сохраняем все имена меток в списке. Затем, перебирая этот список, мы используем ndex и значение для создания виджетов входа и метки. Мы используем ndex для управления нашей сеткой. place() не подходит для размещения виджетов, потому что, если вам нужно внести какие-либо изменения, вам может потребоваться переписать когда-либо одно место, чтобы компенсировать это. Затем просто обновите значения ячеек, указав правильный индекс в списке записей. Здесь также не было необходимости в холсте. Похоже, все, для чего он использовался, был цветным.

Пример:

import tkinter as tk
from datetime import datetime
from openpyxl import load_workbook


ht = 500
wt = 500
root = tk.Tk()
root.geometry('{}x{}'.format(ht, wt))
root.config(bg='#3363F9')
root.rowconfigure(0, weight=1)
root.rowconfigure(2, weight=1)
root.columnconfigure(0, weight=1)
root.columnconfigure(2, weight=1)
var = tk.StringVar()
var.set(datetime.date(datetime.now()))


def call():
    n = 4
    j = d.get() + " 00:00:00"
    wb = load_workbook('file.xlsx')
    sheet = wb.active

    while True:
        a1 = sheet.cell(row=n, column=2)
        if j == str(a1.value):
            break

        n = n + 1

    sheet.cell(row=n, column=3).value = entry_list[1].get()
    sheet.cell(row=n, column=4).value = entry_list[5].get()
    sheet.cell(row=n, column=5).value = entry_list[0].get()
    sheet.cell(row=n, column=6).value = entry_list[7].get()
    sheet.cell(row=n, column=7).value = entry_list[3].get()
    sheet.cell(row=n, column=8).value = entry_list[4].get()
    sheet.cell(row=n, column=9).value = entry_list[2].get()
    sheet.cell(row=n, column=11).value = entry_list[6].get()
    wb.save('file.xlsx')


frame = tk.Frame(root, bg='#3363F9')
frame.grid(row=1, column=1)

label_list = ["math", "physics", "arabic", "English", "German", "Chemistry", "transportation", "food"]
entry_list = []

for ndex, label in enumerate(label_list):
    tk.Label(frame, text=label, bg='#3363F9', fg='white').grid(row=ndex+2, column=0, sticky='e')
    entry_list.append(tk.Entry(frame))
    entry_list[-1].grid(row=ndex+2, column=1)

d = tk.Entry(frame, textvariable=var)
d.grid(row=0, column=2)
tk.Button(frame, text="get", command=call).grid(row=1, column=2)
root.mainloop()

Тем не менее, мы можем уменьшить это, если вы согласитесь изменить некоторые столбцы в вашем файле Excel. Если вы хотите сопоставить столбцы с метками по порядку, вы можете сделать это вместо этого:

def call():
    n = 4
    j = d.get() + " 00:00:00"
    wb = load_workbook('file.xlsx')
    sheet = wb.active

    while True:
        a1 = sheet.cell(row=n, column=2)
        if j == str(a1.value):
            break

        n = n + 1

    for i in range(8):
        sheet.cell(row=n, column=i+3).value = entry_list[i].get()
    wb.save('file.xlsx')
...