我正在尝试使用
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.
听起来您遇到的问题可能与宏运行时 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 中读取。
通过直接从工作簿中读取数据,您可以避免依赖剪贴板,并可能避免遇到冻结问题。