提交数据后清除条目

2024-09-29 02:25:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个从tkinterGUI在excel文件中插入数据的代码。提交数据后,文本仍显示在条目上,我希望自动清除文本或将其分配给按钮。我试过这个,但没有成功

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

Tags: textwsvaluecellcolumnrootmergestart
3条回答

这对我来说很好:

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

单击按钮后,需要为执行的命令中的每个条目添加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()

正如其他人所指出的delete(o, 'end')是您正在寻找的,但是我认为您还可以从学习如何动态生成输入字段中获益,从而节省编写这么多行代码的时间

  1. 所有进口商品都应该排在最前面。不是在功能上。现在,每次按下按钮时都导入Alignment,而不是在代码开头只导入一次

  2. global e2没有做你认为是的事。就目前而言,这对你来说绝对没有任何好处。Global用于告诉函数全局名称空间中存在已定义的值,但这必须在函数中完成,才能在其外部工作

  3. 使用import tkinter as tk代替from tkinter import *。这将有助于防止覆盖方法

  4. 重写代码,在一个范围内循环以生成输入字段。这可以通过组合使用list或2和for循环来实现,并使代码更易于阅读

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

相关问题 更多 >