0

I am new to software development and I am using cx_freeze to make an executable file of a hello.py python file which is using PyQt5 module. The following error occurs repeatedly. I am using python 3.6 and PyQt5 as stated.

image

AttributeError: module 'lxml.etrr' has no attribute 'fromstring'

image

Below is my hello.py file

import sys
import time
import wikipedia
import docx
import requests
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *

doc = docx.Document()

class App(QMainWindow):


    def __init__(self):
        super().__init__()
        self.title = 'Articulate - tecbeast.com'
        self.left = 50
        self.top = 100
        self.width = 400
        self.height = 300
        self.initUI()

    def initUI(self):
        self.setWindowTitle(self.title)
        self.setGeometry(self.left, self.top, self.width, self.height)
        lbl1 = QLabel(self)
        lbl1.setText("Please enter the topics you want to print articles on")
        lbl1.setGeometry(20,20,400,40)

        lbl2 = QLabel(self)
        lbl2.setText('Topics should be separeted by comma ","')
        lbl2.setGeometry(20,40,400,40)

        lbl3 = QLabel(self)
        lbl3.setText('Make sure that your pc is connected to the internet')
        lbl3.setGeometry(20,60,400,40)

        # Create textbox
        self.textbox = QLineEdit(self)
        self.textbox.move(20, 100)
        self.textbox.resize(280,40)

        # Create a button in the window
        self.button = QPushButton('Make Article', self)
        self.button.move(20,160)

        # connect button to function on_click
        self.button.clicked.connect(self.on_click)
        self.show()

    def shw_wt(self):
        #for the showing of label Please wait
        lbl4 = QLabel(self)
        lbl4.setText('Please wait')
        lbl4.setGeometry(20,135,400,40)
        lbl4.show()



    @pyqtSlot()
    def on_click(self):
        self.shw_wt()
        cur_topic = self.textbox.text()
        topics = cur_topic.split(",")
        for ech_topic in topics:
            try:
                para = wikipedia.summary(ech_topic, sentences = 100)
            except wikipedia.exceptions.DisambiguationError as e:
                para = wikipedia.summary(e.options[0], sentences = 100)
            except requests.exceptions.ConnectionError as e:
                pop_up = QMessageBox.question(self, 'Warning!', 'You are not connected to the internet', QMessageBox.Ok)
                if pop_up == QMessageBox.Ok:
                   self.initUI()
                   #problem in above line
                else:
                   pass
            doc.add_heading (ech_topic,0)
            doc.add_paragraph(para)
        n = str(time.time())
        doc.save(n+".docx")
        pop_up = QMessageBox.question(self, 'All Done', 'Your article is made. Check your current directory', QMessageBox.Ok)
        if pop_up == QMessageBox.Ok:
            pass
        else:
            pass
        #lbl4.hide()
        self.show()



if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = App()
    sys.exit(app.exec_())
suiwenfeng
  • 1,865
  • 1
  • 25
  • 32
Akash Kumar
  • 81
  • 1
  • 1
  • 10

3 Answers3

0

Does your hello.py have any imported libraries?

Zak Vogt
  • 83
  • 6
  • yes! These are the ones - sys, time, wikipedia, docx, queue, requests, from PyQt5.QtWidgets import *, from PyQt5.QtGui import *, from PyQt5.QtCore import * – Akash Kumar Mar 16 '17 at 14:20
0

In your setup.py you need to include the modules you have used and include them in the build.

Here is a link to an answer that explains it better than I can. Based on your answer, you will need to use paths for all the modules you've imported. It is better to use only what you need from each module, and may require more research about how each module.

sourceforge help topic

Zak Vogt
  • 83
  • 6
  • sorry. But just I tried out a simple gui program and it worked. It seems cx_freeze can't render the python-docx module. – Akash Kumar Mar 16 '17 at 17:11
0

reproduced the issue,in my environment.

please try my setup.py

import sys
from cx_Freeze import setup, Executable

# Dependencies are automatically detected, but it might need fine tuning.
build_exe_options = {
    "packages": ["idna","lxml"],
    "includes": ["urllib3","queue"],
    "excludes": ["tkinter"],
    # "include_files":[('./platforms','./platforms')] # uncomment if need qwindows.dll for qt5 application, you need put qwindows.dll in "./platforms" folder.
}

# GUI applications require a different base on Windows (the default is for a
# console application).
base = None
if sys.platform == "win32":
    base = "Win32GUI"

setup(  name = "demo",
        version = "0.1",
        description = "demo",
        options = {"build_exe": build_exe_options},
        executables = [Executable("demo.py", base=base)])

root cause is missing the lxml package in target folder. you need specify the packages in build options below.

build_exe_options = {
    "packages": ["idna","lxml"],
    "includes": ["urllib3","queue"],
    "excludes": ["tkinter"],
    # "include_files":[('./platforms','./platforms')] # uncomment if need qwindows.dll for qt5 application, you need put qwindows.dll in "./platforms" folder.
}
suiwenfeng
  • 1,865
  • 1
  • 25
  • 32