tkinter 用户输入小部件到 xlsx

tkinter user input widget to xlsx

如何将用户输入从 tkinter 条目小部件写入 xlsx? 我应该使用不同的模块吗?

from tkinter import *
import xlsxwriter

def output():

    c = Toplevel(root)
    c.title =("Main")
    c.geometry =('')


    e= Entry(c, width=20).grid(row=0, column=1, sticky=W, padx=10)
    l=Label(c, text="Current Value").grid(row = 0, column=0, sticky=W, padx=10)


    e2 = Entry(c, width=20).grid(row=1, column=1, sticky=W, padx=10)
    l2= Label(c, text="New Value").grid(row = 1, column=0, sticky=W, padx=10)
    b=Button(c, text="Submit",command= write_to_xlsx).grid(row= 1, column=2, sticky=E, padx=10)



def write_to_xlsx():


    workbook =xlsxwriter.Workbook('tkintertest18.xlsx')

    worksheet = workbook.add_worksheet()

    worksheet.write_string('C1', 'e2.get()')

    workbook.close()


root = Tk()
root.title("Main Menu")
root.geometry('400x400+230+130')

Button(root, text="1", command=output).grid(row =0, column= 2)

root.mainloop()

当涉及到 tkinter 时,您几乎总是 使用 class。所以这是上面代码的工作原型。有很多问题。一个是当你在你的小部件旁边拍打 grid 而不是将它们放在新的一行时,grid returns None,而不是对象。将应用程序实现为 class 使其他功能能够访问 GUI 组件(在本例中为 self.e2)。另一个错误是您对 'e2.get()' 调用进行了单引号,从技术上讲,它是一个字符串。所以删除引号可以解决这个问题。可能还有其他事情...

import xlsxwriter

class XLwriter:

    def __init__(self):

        c = Toplevel(root)
        c.title =("Main")
        c.geometry =('')


        self.e= Entry(c, width=20).grid(row=0, column=1, sticky=W, padx=10)
        self.l=Label(c, text="Current Value").grid(row = 0, column=0, sticky=W, padx=10)


        self.e2 = Entry(c, width=20)
        self.e2.grid(row=1, column=1, sticky=W, padx=10)
        self.l2= Label(c, text="New Value").grid(row = 1, column=0, sticky=W, padx=10)
        self.b=Button(c, text="Submit",command=self.write_to_xlsx).grid(row= 1, column=2, sticky=E, padx=10)



    def write_to_xlsx(self):


        workbook =xlsxwriter.Workbook('tkintertest18.xlsx')

        worksheet = workbook.add_worksheet()

        worksheet.write_string('C1', self.e2.get())

        workbook.close()


root = Tk()
root.title("Main Menu")
root.geometry('400x400+230+130')
app = XLwriter()
#Button(root, text="1", command=output).grid(row =0, column= 2)

root.mainloop()

看到 Ron 已经为您提供了 class 来执行此任务,我将使用非 class 方法来执行此操作,以更准确地反映您当前的代码。

请记住,使用 xlsxwriter 无法读取电子表格,因此对于标记为 "Current Value" 的输入字段,您需要使用不同的 excel 库用电子表格中的数据填充该字段。

如果要与小部件交互,请确保在创建小部件时不直接使用几何管理器。这将 return None 任何试图与之交互的东西。在创建小部件后的下一行,您可以使用小部件变量名称,然后使用您选择的几何管理器 (grid(), pack(), place())。这将使我们能够与小部件进行交互,而不会出现 None 被几何管理器 return 编辑的问题。

为了能够在 output() 函数之外与 e2 进行交互,您需要将 e2 分配给 global 命名空间。您只需在 output() 函数中添加 global e2 即可。

注意:尽可能避免使用 global 这是使用更面向对象的编程方法 (class) 的一个令人信服的理由,因为在使用 [=29= 时不需要使用 global ]属性。

from tkinter import *
import xlsxwriter

root = Tk()
root.title("Main Menu")
#root.geometry('400x400+230+130')

def output():
    global e2
    c = Toplevel(root)
    c.title = ("Main")

    e = Entry(c, width = 20)
    e.grid(row = 0, column = 1, sticky = W, padx = 10)
    l = Label(c, text = "Current Value")
    l.grid(row = 0, column = 0, sticky = W, padx = 10)

    e2 = Entry(c, width=20)
    e2.grid(row = 1, column = 1, sticky = W, padx = 10)
    l2 = Label(c, text = "New Value")
    l2.grid(row = 1, column = 0, sticky = W, padx = 10)
    b = Button(c, text = "Submit",command = write_to_xlsx)
    b.grid(row = 1, column = 2, sticky = E, padx = 10)

def write_to_xlsx():
    workbook = xlsxwriter.Workbook('tkintertest18.xlsx')
    worksheet = workbook.add_worksheet()
    worksheet.write_string('C1', e2.get())
    workbook.close()

btn = Button(root, text = "1", command = output)
btn.grid(row = 0, column = 2)

root.mainloop()