使用 Xlwings 从 Excel 运行 python 脚本时无法将数据从 Excel 复制到 Tkinter GUI

问题描述 投票:0回答:1

我正在尝试使用

python
xlwings
自动化 Excel 工作簿。我想做的一部分是通过
Tkinter
GUI 从 excel 获取输入(用户从 Excel 复制输入并将其传递到输入框),然后使用 python 对其进行一些处理。我已经编写了一个将 Excel 按钮与 python 脚本连接起来的宏(单击 Excel 按钮后将显示一个 GUI,用户可以粘贴和复制所需的输入)。现在,当我单击 Excel 按钮时,GUI 会按预期显示,但奇怪的是 Excel 不允许我将数据从多个选项卡复制并粘贴到 GUI(Excel 冻结或类似的东西(如果我从一个选项卡复制数据我无法从其他选项卡获取任何数据))这仅在我使用
xlwings
从 Excel 运行 python 脚本时发生 但是如果从任何 IDE 或终端运行 python 脚本,一切都会按预期工作。

我尝试在互联网上搜索类似问题,但一无所获。我还认为线程可以解决问题,但程序在从任何 python IDE 执行时运行良好。
所以我最后认为这可能是 Excel/

xlwings
的问题,但我不知道这里的问题是什么。

我希望我清楚地解释了我的问题,如果没有,请告诉我需要澄清的地方。

这里是一个最小的可重现代码

from tkinter import *



class SampleSpaceGUI(Tk):
    """This class is used to create a GUI for the user to choose the sample space for histogram plotting"""

    def __init__(self):
        Tk.__init__(self, None)
        self.input=None
        self.sample_space_gui()

    def submit(self, custom_sample_space_box):

        custom_lst = custom_sample_space_box.get().replace('\n ', '').lstrip().strip().rstrip(',').split(',')
        self.input = custom_lst
        self.withdraw()
        self.quit()
        self.destroy()

    def sample_space_gui(self):
        """
        main function of the class
        :return: no return
        """
        frame = LabelFrame(self, padx=5, pady=5)
        frame.pack(padx=5, pady=5)

        custom_sample_space_box = Entry(frame, width=100)
        custom_sample_space_box.pack()


        # submit button
        btn_frame = LabelFrame(frame, padx=5, pady=5)
        btn_frame.pack()

        b = Button(btn_frame, text='Submit', command=lambda: self.submit(custom_sample_space_box))

        b.pack()



def func():
    app = SampleSpaceGUI()
    app.mainloop()
    
    input1 = app.input

    app2 = SampleSpaceGUI()
    app2.mainloop()
    
    input2 = app.input
    
    # do some processing on input1 and input2

我正在使用 Excel 2013.

python excel tkinter xlwings
1个回答
0
投票

听起来您遇到的问题可能与宏运行时 Excel 处理其剪贴板的方式有关。当宏运行时,Excel 的剪贴板可能会为宏保留,这可以防止其他应用程序(例如您的 GUI)访问剪贴板。

要解决此问题,您可以尝试使用 xlwings 的内置 Range 对象直接从 Excel 工作簿读取数据,而不是依赖用户将数据复制并粘贴到您的 GUI 中。这是一个示例,说明如何修改代码以使用 xlwings(在代码末尾)从 Excel 读取数据:

import xlwings as xw

def func():
    wb = xw.Book('path/to/your/workbook.xlsx')
    
    input1 = wb.sheets['Sheet1'].range('A1').value
    input2 = wb.sheets['Sheet2'].range('B1').value
    
    app = SampleSpaceGUI()
    app.mainloop()
    
    input3 = app.input
    
    # do some processing on input1, input2, and input3

在本例中,input1 和 input2 是使用 Sheet 对象的 range 方法直接从 Excel 工作簿中读取的。 input3 变量仍然像以前一样从 GUI 中读取。

通过直接从工作簿中读取数据,您可以避免依赖剪贴板,并可能避免遇到冻结问题。

© www.soinside.com 2019 - 2024. All rights reserved.