voce chiara dopo l'invio dei dati

2020-02-22 python tkinter

Ho un codice per inserire dati su un file Excel da una GUI di tkinter . Dopo aver inviato i dati, il testo viene ancora visualizzato sulla voce e desidero cancellare automaticamente il testo o assegnarlo a un pulsante. Ho provato questo Come cancellare il widget Voce dopo aver premuto un pulsante in Tkinter? ma senza successo

from datetime import date, datetime
from tkinter import *
from openpyxl.styles import PatternFill, Border, Side, Alignment, Protection, Font
import os

import openpyxl

wb = openpyxl.load_workbook('excel.xlsx')  # selectie fisier
sheet = wb["Productie"]  # selectie Fila
weekNumber = date.today().isocalendar()[1]  # cautare numarul saptamanii

root = Tk()
root.title("Main Menu")

def write_to_xlsx():
    model = e.get()
    etapa = e2.get()
    batch = e3.get()
    qty = e4.get()
    sn1 = e5.get()

    ws = wb.active
    maxim = ws.max_row + 1  # Definire capat de lista
    # Imbinare celule
    ws.merge_cells(start_row=maxim, start_column=1, end_row=maxim + 1, end_column=1)  # A
    ws.merge_cells(start_row=maxim, start_column=2, end_row=maxim + 1, end_column=2)  # B
    ws.merge_cells(start_row=maxim, start_column=3, end_row=maxim + 1, end_column=3)  # C
    ws.merge_cells(start_row=maxim, start_column=4, end_row=maxim + 1, end_column=4)  # D
    ws.merge_cells(start_row=maxim, start_column=5, end_row=maxim + 1, end_column=5)  # E
    ws.merge_cells(start_row=maxim, start_column=6, end_row=maxim + 1, end_column=6)  # F
    ws.merge_cells(start_row=maxim, start_column=7, end_row=maxim + 1, end_column=7)  # G
    ws.merge_cells(start_row=maxim, start_column=8, end_row=maxim + 1, end_column=8)  # H
    ws.merge_cells(start_row=maxim, start_column=24, end_row=maxim + 1, end_column=24)  # X
    ws.merge_cells(start_row=maxim, start_column=25, end_row=maxim + 1, end_column=25)  # Y
    # Introducere formule
    weekNumber = date.today().isocalendar()[1]  # cautare numarul saptamanii
    ws.cell(column=1, row=maxim, value=weekNumber)  # A-Week

    now = datetime.now()  # importare data si ora
    dt_string = now.strftime('%d/%m')  # formatare sa arate doar ziua si luna
    ws.cell(column=2, row=maxim, value=dt_string)  # B zi/luna
    from openpyxl.styles import Alignment

    ws.cell(column=3, row=maxim, value=model)

    ws.cell(column=4, row=maxim, value=etapa)

    ws.cell(column=5, row=maxim, value=batch)

    ws.cell(column=6, row=maxim, value=int(qty))

    ws.cell(column=7, row=maxim, value=int(sn1))

    ws.cell(column=8, row=maxim, value=int(sn1 + qty))

    rows = range(1, maxim + 1)
    columns = range(1, 8)
    for row in rows:
        for col in columns:
            sheet.cell(row, col).alignment = Alignment(horizontal='center', vertical='center', wrap_text=True)

    wb.save("excel.xlsx")


global e2

e = Entry(root, width=20)
e.grid(row=0, column=1, sticky=W, padx=15)
l = Label(root, text="Model")
l.grid(row=0, column=0, sticky=W, padx=15)

e2 = Entry(root, width=20)
e2.grid(row=1, column=1, sticky=W, padx=15)
modela = Label(root, text="Etapa")
modela.grid(row=1, column=0, sticky=W, padx=15)

e3 = Entry(root, width=20)
e3.grid(row=2, column=1, sticky=W, padx=15)
model1 = Label(root, text="Batch")
model1.grid(row=2, column=0, sticky=W, padx=15)

e4 = Entry(root, width=20)
e4.grid(row=3, column=1, sticky=W, padx=15)
model2 = Label(root, text="Cantitate")
model2.grid(row=3, column=0, sticky=W, padx=15)

e5 = Entry(root, width=20)
e5.grid(row=4, column=1, sticky=W, padx=15)
model3 = Label(root, text="S/N")
model3.grid(row=4, column=0, sticky=W, padx=15)

submit = Button(root, text="Submit", command=write_to_xlsx)
submit.grid(row=1, column=2, sticky=E, padx=10)

root.mainloop()

Answers

Questo ha funzionato bene per me:

def clear_text():
    e.delete(0, 'end')
    e2.delete(0, 'end')
    e3.delete(0, 'end')
    e4.delete(0, 'end')
    e5.delete(0, 'end')

È necessario aggiungere delete(0, END) per ciascuna voce del comando eseguito dopo aver fatto clic sul pulsante. Esempio sotto:

from tkinter import *

root = Tk()
def write_to_xlsx():
    e.delete(0, END)

e = Entry(root, width=20)
e.grid(row=4, column=1, sticky=W, padx=15)
submit = Button(root, text="Submit", command=write_to_xlsx)
submit.grid(row=1, column=2, sticky=E, padx=10)
root.mainloop()

Come hanno sottolineato gli altri, delete(o, 'end') è ciò che stai cercando, tuttavia penso che trarrai vantaggio anche dall'imparare come generare dinamicamente i campi di immissione per risparmiare sulla scrittura di così tante righe di codice.

  1. Tutte le importazioni dovrebbero andare in cima. Non nelle funzioni. Come è ora stai importando Alignment ogni volta che il pulsante viene premuto anziché solo una volta all'inizio del codice.

  2. global e2 non sta facendo quello che pensi che sia. Allo stato attuale, questo non fa assolutamente nulla per te. Globale è usato per dire a una funzione che esiste un valore definito nello spazio dei nomi globale, ma questo deve essere fatto nella funzione per funzionare non al di fuori di esso.

  3. Invece di from tkinter import * usa import tkinter as tk . Ciò contribuirà a prevenire la sovrascrittura del metodo.

  4. Riscrivi il codice per scorrere un intervallo per creare i campi di immissione. Questo può essere fatto con una combinazione di un list o 2 e un ciclo for e faciliterà la lettura del codice.

  5. La parte principale della tua domanda. Per eliminare tutto in un campo di immissione si desidera eseguire entry.delete(o, 'end) .

Codice pulito. Fatemi sapere se avete domande:

import tkinter as tk
from datetime import date, datetime
from openpyxl.styles import Alignment
import openpyxl

wb = openpyxl.load_workbook('excel.xlsx')
sheet = wb["Productie"]
week_number = date.today().isocalendar()[1]

root = tk.Tk()
root.title("Main Menu")


def write_to_xlsx():
    ws = wb.active
    maxim = ws.max_row + 1

    for i in range(8):
        ws.merge_cells(start_row=maxim, start_column=i+1, end_row=maxim + 1, end_column=i+1)  # A

    ws.merge_cells(start_row=maxim, start_column=24, end_row=maxim + 1, end_column=24)  # X
    ws.merge_cells(start_row=maxim, start_column=25, end_row=maxim + 1, end_column=25)  # Y
    week_number = date.today().isocalendar()[1]
    ws.cell(column=1, row=maxim, value=week_number)

    now = datetime.now()
    dt_string = now.strftime('%d/%m')
    ws.cell(column=2, row=maxim, value=dt_string)

    for ndex, entry in enumerate(entry_list):
        ws.cell(column=ndex+3, row=maxim, value=entry_list[ndex].get())
        entry_list[ndex].delete(0, 'end')

    rows = range(1, maxim + 1)
    columns = range(1, 8)
    for row in rows:
        for col in columns:
            sheet.cell(row, col).alignment = Alignment(horizontal='center', vertical='center', wrap_text=True)

    wb.save("excel.xlsx")


label_list = ['Model', 'Etapa', 'Batch', 'Cantitate', 'S/N']
entry_list = []

for i in range(len(label_list)):
    tk.Label(root, text=label_list[i]).grid(row=i, column=0, sticky='w', padx=15)
    entry_list.append(tk.Entry(root, width=20))
    entry_list[-1].grid(row=i, column=1, sticky='w', padx=15)

tk.Button(root, text='Submit', command=write_to_xlsx).grid(row=1, column=2, sticky='e', padx=10)
root.mainloop()

Related