запись очищается после отправки данных - PullRequest
0 голосов
/ 21 февраля 2020

У меня есть код для вставки данных в файл Excel из tkinter GUI. После отправки данных текст все еще отображается в записи, и я хочу автоматически очистить текст или назначить его кнопке. Я пробовал это Как очистить виджет «Ввод» после нажатия кнопки в Tkinter? , но безуспешно

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()

Ответы [ 3 ]

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

Вам нужно добавить delete(0, END) для каждой записи в выполненной вами команде после нажатия кнопки. Пример ниже:

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 голосов
/ 22 февраля 2020

Как уже отмечали другие delete(o, 'end') - это то, что вы ищете, однако я думаю, что вам также было бы полезно узнать, как динамически генерировать поля ввода, чтобы сэкономить на написании такого количества строк кода.

  1. Весь импорт должен go вверху. Не в функциях. Как и сейчас, вы импортируете Alignment каждый раз при нажатии кнопки, а не один раз в начале кода.

  2. global e2 не выполняет то, что вы думаете , В нынешнем виде это абсолютно ничего не значит для вас. Global используется, чтобы сообщить функции, что определенное значение существует в глобальном пространстве имен, но это должно быть сделано в функции, чтобы работать не вне ее.

  3. Вместо from tkinter import * use import tkinter as tk. Это поможет предотвратить перезапись метода.

  4. Перепишите код в l oop через диапазон, чтобы построить поля ввода. Это можно сделать с помощью комбинации list или 2 и for l oop, что облегчит чтение кода.

  5. Основная часть вашего вопроса , Чтобы удалить все в поле ввода, вы хотите сделать entry.delete(o, 'end).

Очистить код. Дайте мне знать, если у вас есть какие-либо вопросы:

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 голосов
/ 21 февраля 2020

У меня сработало нормально:

def clear_text():
    e.delete(0, 'end')
    e2.delete(0, 'end')
    e3.delete(0, 'end')
    e4.delete(0, 'end')
    e5.delete(0, 'end')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...