【问题标题】:Python Tkinter and openpyxl return to new row on button pushPython Tkinter 和 openpyxl 在按钮按下时返回新行
【发布时间】:2021-10-11 13:22:27
【问题描述】:

我正在尝试写入一个 excel 文件(LibreOffice Calc 实际上不是 excel)。我正在尝试保存历史数据,然后在我们的季度会议上绘制状态更新图表(如果格式正确,我可以将信息写入图表,因此这不是问题)。

但是,当我在我的 Tkinter 窗口上按下一个按钮时,我遇到了一个问题,我想要写入的信息记录在我的 excel 文件中,但是每次我按下按钮时,它都会覆盖第一行。下面是我的代码的过度简化示例。我不知道还要向我的 def 函数添加什么以返回新行,所以我不会覆盖我的信息。想法?

from tkinter import *
from openpyxl import Workbook

def excel ():
     wb=Workbook()
     ws=wb.active
     cellx='A1'
     ws[cellx]=E1.get()
     wb.save("sample.xlsx")
     #Assumeing I need something similar to ws.cell(row=cellx+1) but it doesn't work.

root=Tk()

L1=Label(root,text="Tester")
E1=Entry(root,width=10)
b1=Button(root,text="Save",command=excel)

L1.pack()
E1.pack()
b1.pack()

root.mainloop()

在实际代码中,会有一些输入框包含单词和一些只包含数字。

【问题讨论】:

  • 你认为ws[cellx]=E1.get(),当cellx = 'A1'在前面的陈述中明确,应该做什么?你认为cellx 应该怎样才能完成这项工作?
  • 如果你写在A1,那么你写在第一行。如果您想保存在新行中,那么当您按下按钮时,您必须将A1 更改为A2,然后更改为A3,等等。因为A1 是一个文本,所以你不能这样做"A1"+1 .你必须将行号保留在其他变量中 - row = 1 然后再做 row +=1cellx = f"A{row}"

标签: python excel tkinter openpyxl data-entry


【解决方案1】:

您可以简单地使用ws.append(...) 将输入文本附加到下一个空行:

from openpyxl import Workbook, load_workbook

FILENAME = "sample.xlsx"

def excel():
    try:
        # load workbook if it exists already
        wb = load_workbook(filename=FILENAME)
    except FileNotFoundError:
        # create new workbook
        wb = Workbook()
    ws = wb.active
    ws.append([E1.get()]) # append to next empty row
    wb.save(FILENAME)

【讨论】:

  • 这非常有效,谢谢我之前遇到了 append 函数的问题,但在看到你的示例代码后我意识到我的错误。谢谢!
【解决方案2】:

您始终使用相同的cellx = "A1",因此您总是排在同一行。您必须增加"A1" 中的数字并使用"A2""A3" 等。但是"A1" 是一个字符串,您不能这样做"A1" + 1

你必须保持数字为integer,增加它,然后用char"A"将其转换为字符串

# outside function
row = 0

# inside function
global row

row += 1
cellx = f"A{row}"

你必须设置row = 0 外部函数(创建全局变量)和内部函数你必须使用global 来通知函数它必须在外部/全局变量中保留新值。


import tkinter as tk  # PEP8: `import *` is not preferred

from openpyxl import Workbook

def excel():
    global row   # inform function that it has to assing new value to global variable
    
    row += 1
    
    cellx = f"A{row}"
    print('cellx:', cellx)
    
    wb = Workbook()  # PEP8: spaces around `=`
    ws = wb.active
     
    ws[cellx] = e1.get()
    wb.save("sample.xlsx")

# ---

row = 0  # global variable (it doesn't need word `global`)

root = tk.Tk()  # PEP8: spaces around `=`

l1 = tk.Label(root, text="Tester")  # PEP8: space after `,`
e1 = tk.Entry(root, width=10)  # PEP8: `lower_case_names` for variables
b1 = tk.Button(root, text="Save", command=excel)

l1.pack()
e1.pack()
b1.pack()

root.mainloop()

PEP 8 -- Style Guide for Python Code


顺便说一句:

如果您再次运行脚本,则它会再次从A1 开始并替换旧内容。如果要添加到新行,则必须将值 row 保存在文件中并在开始时读取它,并在关闭程序时(或保存 Excel 时)保存它。或者你必须在openpyxl 中找到方法来检测哪一行是空的。

【讨论】:

    猜你喜欢
    • 2017-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-09
    • 1970-01-01
    • 2021-12-20
    相关资源
    最近更新 更多