Ich habe einen Code zum Einfügen von Daten in eine Excel-Datei von einer tkinter GUI. Nachdem ich die Daten übermittelt habe, wird der Text immer noch auf dem Eintrag angezeigt und ich möchte den Text automatisch löschen oder einer Schaltfläche zuweisen. Ich habe versucht, zu löschen das Eintrags-Widget nach dem Drücken einer Schaltfläche in Tkinter?, jedoch ohne Erfolg

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()
-1
Filip Adrian 21 Feb. 2020 im 23:17

3 Antworten

Beste Antwort

Wie die anderen bereits betont haben, ist delete(o, 'end') das, wonach Sie suchen. Ich denke, Sie würden auch davon profitieren, wenn Sie lernen, wie Sie Ihre Eingabefelder dynamisch generieren, um beim Schreiben so vieler Codezeilen zu sparen.

  1. Alle Importe sollten oben stehen. Nicht in Funktionen. So wie es jetzt ist, importieren Sie Alignment jedes Mal, wenn die Taste gedrückt wird, anstatt nur einmal am Anfang des Codes.

  2. global e2 tut nicht das, was Sie denken. So wie es jetzt aussieht, tut dies absolut nichts für Sie. Global wird verwendet, um einer Funktion mitzuteilen, dass ein definierter Wert im globalen Namespace vorhanden ist. Dies muss jedoch in der Funktion erfolgen, damit nicht außerhalb davon gearbeitet wird.

  3. Verwenden Sie anstelle von from tkinter import * import tkinter as tk. Dies verhindert das Überschreiben der Methode.

  4. Schreiben Sie Ihren Code neu, um einen Bereich zu durchlaufen und Ihre Eingabefelder zu erstellen. Dies kann mit einer Kombination aus einer list oder 2 und einer for Schleife erfolgen und erleichtert das Lesen Ihres Codes.

  5. Der Hauptteil Ihrer Frage. Um alles in einem Eingabefeld zu löschen, möchten Sie entry.delete(o, 'end).

Code bereinigt. Lassen Sie mich wissen, wenn Sie Fragen haben:

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()
0
Mike - SMT 21 Feb. 2020 im 21:40

Sie müssen delete(0, END) für jeden Eintrag in Ihrem ausgeführten Befehl nach dem Klicken auf die Schaltfläche hinzufügen. Beispiel unten:

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()
0
Zaraki Kenpachi 21 Feb. 2020 im 20:32

Das hat bei mir gut funktioniert:

def clear_text():
    e.delete(0, 'end')
    e2.delete(0, 'end')
    e3.delete(0, 'end')
    e4.delete(0, 'end')
    e5.delete(0, 'end')
0
John 21 Feb. 2020 im 20:29