tkinter用户输入小部件到xlsx

时间:2017-06-26 17:15:15

标签: python-3.x tkinter widget user-input xlsxwriter

如何将用户输入从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()

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

看到Ron已经为您提供了一个执行此任务的类,我将使用非类方法进行响应,以便更准确地反映您当前的代码。

请注意,使用--executor-memory无法从电子表格中读取内容,因此对于标有xlsxwriter的输入字段,您需要使用其他excel库来填充该字段包含电子表格中的数据。

确保您是否要与不使用几何管理器的窗口小部件进行交互,并创建窗口小部件。这将向尝试与之交互的任何内容返回None。在创建窗口小部件后的下一行中,您可以使用窗口小部件变量名称,然后使用您选择的几何管理器("Current Value")。这将允许我们与窗口小部件进行交互,而几何管理器不会返回None。

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

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

output()