2016-09-29 131 views
3

我有一個在pyqt4中創建的gui,它有一個函數可以調用應該使用pandas excelwriter寫入excel表格的模塊。出於某種原因,它會創建工作表,但不會寫入任何內容。它只是在沒有任何錯誤的情況下崩潰了我的qui。當我在調試模式下運行它時,顯然它沒有任何問題。過去幾天我一直在調試,現在指出pyqt和excelwriter之間的問題。是否有一個已知的問題,pyqt不喜歡熊貓excelwriter?PYQT4無法寫入excelwriter

from PyQt4 import QtCore,QtGui 
import sys 
from MAIN_GUI import * 

if __name__=="__main__": 
    app = Qt.Gui.QApplication(sys.argv) 


class MAIN_GUI(QtGui.QMainWindow): 
     def __init__self: 
      super(MAIN_GUI, self.__init__: 
      self.uiM=Ui_MainWindow 
      self.uiM.setupUi(self) 
      self.connect(self.uiM.updateALL_Button,QtCore.SIGNAL('clicked()'),self.updateALLEXCEL) 

def updateALLEXCEL(self): 
    import excel_dummy 

main_gui = MAIN_GUI() 
main_gui.show() 
main_gui.raise_() 
sys.exit(app.exec_()) 

--- excel_dummy.py ---

import pandas as pd 
from pandas import ExcelWriter 

def excelify(): 
    with ExcelWriter('/home/Desktop/Excelified/final.xlsx', engine='xlsxwriter') as writer: 

     workbook=writer.book 
     worksheet=workbook.add_worksheet() 
     worksheet.write(2,2,'just write something') 
    writer.save() 
excelify() 

--- MAIN_GUI.py ---

from PyQt4 import QtCore,QtGui 
try: 
    _fromUtf8 = QtCore.QString.fromUtf8 
except AttributeError: 
    def _fromUtf8(s): 
     return s 

try: 
    _encoding = QtGui.QApplication.unicodeUTF8 
    def _translate(context, text, disambig): 
     return QtGui.QApplication.translate(context, text, disambig, _encoding) 
except AttributeError: 
    def _translate(context, text, disambig): 
     return QtGui.QApplication.translate(context, text, disambig) 

class Ui_MainWindow(object): 
    def setupUi(self, MainWindow): 
     MainWindow.setObjectName(_fromUtf8("MainWindow")) 
     MainWindow.resize(320,201) 
     self.centralwidget = QtGui.QWidget(MainWindow) 
     self.centralwidget.setObjectName(_fromUtf8("centralwidget")) 
     self.updateALL_Button = QtGui.QPushButton(self.centralwidget) 
     self.updateALL_Button.setGeometry(QtCore.QRect(40,110,161,27)) 
     self.updateALL_Button.setFocusPolicy(QtCore.Qt.NoFocus) 
     self.updateAll_Button.setObjectName(_fromUtf8("Options_updateALL_Button")) 
     MainWindow.setCentralWidget(self.centralwidget) 
     self.menubar = QtGui.QMenuBar(MainWindow) 
     self.menubar.setGeometry(QtCore.QRect(0, 0, 320, 24)) 
     self.menubar.setObjectName(_fromUtf8("menubar")) 
     MainWindow.setMenuBar(self.menubar) 
     self.statusbar = QtGui.QStatusBar(MainWindow) 
     self.statusbar.setObjectName(_fromUtf8("statusbar")) 
     MainWindow.setStatusBar(self.statusbar) 

     self.retranslateUi(MainWindow) 
     QtCore.QMetaObject.connectSlotsByName(MainWindow) 

    def retranslateUi(self,MainWindow): 
     MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow", None)) 
     self.updateALL_Button.setText(_translate("MainWindow", "updateALL", None)) 
+0

@ekhumoro你認爲你有這個解決方案? – Daniel

+0

沒有辦法運行您的示例代碼,該代碼不完整並且存在語法錯誤。請閱讀關於如何製作[mcve]的指導。 – ekhumoro

+0

對不起,我以爲你可以看看它,看看問題是什麼。我編輯/更新了我的問題 – Daniel

回答

3

下面的代碼適用於我。也就是說,我點擊updateALL按鈕後,它打印此:

file size: 5259 "/tmp/final.xlsx" 

並查看生成的文件表明這一點:

enter image description here

注意,我不得不修復了不少的bug來讓你的例子工作。因此,請確保您使用所有當你測試以下文件:

main.py

import sys 
from MAIN_GUI import * 
from PyQt4 import QtGui, QtCore 

if __name__=="__main__": 
    app = QtGui.QApplication(sys.argv) 


class MAIN_GUI(QtGui.QMainWindow): 
    def __init__(self): 
     super(MAIN_GUI, self).__init__() 
     self.uiM = Ui_MainWindow() 
     self.uiM.setupUi(self) 
     self.connect(self.uiM.updateALL_Button,QtCore.SIGNAL('clicked()'),self.updateALLEXCEL) 

    def updateALLEXCEL(self): 
     try: 
      import excel_dummy 
     except: 
      from traceback import format_exception 
      msg = ''.join(format_exception(*sys.exc_info())) 
      mb = QtGui.QMessageBox() 
      mb.setWindowTitle('Error') 
      mb.setText('Click Show Details to get the Traceback') 
      mb.setDetailedText(msg) 
      mb.exec_() 


main_gui = MAIN_GUI() 
main_gui.show() 
main_gui.raise_() 
sys.exit(app.exec_()) 

excel_dummy.py

import os, pandas as pd 
from pandas import ExcelWriter 

def excelify(): 
    path = '/tmp/final.xlsx' 
    with ExcelWriter(path, engine='xlsxwriter') as writer: 
     workbook = writer.book 
     worksheet = workbook.add_worksheet() 
     worksheet.write(2, 2, 'just write something') 
     writer.save() 
    print('file size: %s "%s"' % (os.stat(path).st_size, path)) 

excelify() 

MAIN_GUI.py

from PyQt4 import QtCore,QtGui 
try: 
    _fromUtf8 = QtCore.QString.fromUtf8 
except AttributeError: 
    def _fromUtf8(s): 
     return s 

try: 
    _encoding = QtGui.QApplication.unicodeUTF8 
    def _translate(context, text, disambig): 
     return QtGui.QApplication.translate(context, text, disambig, _encoding) 
except AttributeError: 
    def _translate(context, text, disambig): 
     return QtGui.QApplication.translate(context, text, disambig) 

class Ui_MainWindow(object): 
    def setupUi(self, MainWindow): 
     MainWindow.setObjectName(_fromUtf8("MainWindow")) 
     MainWindow.resize(320,201) 
     self.centralwidget = QtGui.QWidget(MainWindow) 
     self.centralwidget.setObjectName(_fromUtf8("centralwidget")) 
     self.updateALL_Button = QtGui.QPushButton(self.centralwidget) 
     self.updateALL_Button.setGeometry(QtCore.QRect(40,110,161,27)) 
     self.updateALL_Button.setFocusPolicy(QtCore.Qt.NoFocus) 
     self.updateALL_Button.setObjectName(_fromUtf8("Options_updateALL_Button")) 
     MainWindow.setCentralWidget(self.centralwidget) 
     self.menubar = QtGui.QMenuBar(MainWindow) 
     self.menubar.setGeometry(QtCore.QRect(0, 0, 320, 24)) 
     self.menubar.setObjectName(_fromUtf8("menubar")) 
     MainWindow.setMenuBar(self.menubar) 
     self.statusbar = QtGui.QStatusBar(MainWindow) 
     self.statusbar.setObjectName(_fromUtf8("statusbar")) 
     MainWindow.setStatusBar(self.statusbar) 

     self.retranslateUi(MainWindow) 
     QtCore.QMetaObject.connectSlotsByName(MainWindow) 

    def retranslateUi(self,MainWindow): 
     MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow", None)) 
     self.updateALL_Button.setText(_translate("MainWindow", "updateALL", None)) 
+0

正確..在我的例子忘了導入PyQt4及其組件...但我最初它.. GUI仍然沒有任何錯誤終止。你使用哪個版本的python和pandas成功運行這個程序? – Daniel

+0

我測試了python-2.7.12和python-3.5.2,以及pandas-0.19。兩者都有相同的結果。您是否在我的答案中測試了**確切的**代碼?除非你這樣做,否則不可能取得任何進展。 – ekhumoro

+0

是的,複製一切都一樣。我使用的是來自anaconda2的python2.7和pandas 0.17.0。 – Daniel

1

writer.save()語句是with ExcelWriter(...) as writer:塊之外。嘗試使用塊內的語句來運行它。

with ExcelWriter('/home/Desktop/Excelified/final.xlsx', engine='xlsxwriter') as writer: 
    workbook=writer.book 
    worksheet=workbook.add_worksheet() 
    worksheet.write(2,2,'just write something') 
    writer.save() 
+0

仍然終止一切。 – Daniel

+0

對不起,您可以添加更多的細節?你得到了什麼錯誤,以及代碼中的什麼地方? – ASGM

+0

沒有錯誤..崩潰在'writer.save()' – Daniel