keep-loving-pythonのブログ

Pythonを愛し続けたいです(Pythonが流行っている限りですが。。。)

pywebview。 pythonでアプリが!!!これは、かなり、注目すべきでは!

pywebview とは

github.com

pywebview is a lightweight cross-platform wrapper around a webview component that allows to display HTML content in its own native GUI window. It gives you the power of web technologies in your desktop application, hiding the fact that the GUI is browser based. Available for Windows, macOS, Linux and Android. You can use pywebview either with a 3rd party web framework or on its own with a two way bridge between Python and DOM.

pywebview uses native GUI for creating a web component window: WinForms on Windows, Cocoa on macOS, QT or GTK on Linux and Kivy for Android. If you choose to freeze your application, pywebview does not bundle a heavy GUI toolkit or web renderer with it, keeping the executable size small. pywebview is compatible with Python 3.

pywebview is created by Roman Sirokov.

ChatGPT訳:

pywebviewは、HTMLコンテンツを独自のネイティブGUIウィンドウ内で表示することを可能にする、軽量でクロスプラットフォームなWebViewコンポーネントのラッパーです。これにより、デスクトップアプリケーションでWeb技術の力を活用でき、GUIがブラウザベースであることを隠します。WindowsmacOSLinuxAndroidで利用可能です。pywebviewは、サードパーティのWebフレームワークと一緒に使用することも、PythonとDOM間の双方向ブリッジを用いて独自に使用することもできます。

pywebviewは、ネイティブGUIを使用してWebコンポーネントウィンドウを作成します。WindowsではWinForms、macOSではCocoaLinuxではQTまたはGTKAndroidではKivyを使用します。アプリケーションをフリーズすることを選択した場合、pywebviewは重いGUIツールキットやWebレンダラーを同梱せず、実行ファイルのサイズを小さく保ちます。pywebviewはPython 3と互換性があります。

pywebviewは、Roman Sirokovによって作成されました。

サンプル

https://github.com/r0x0r/pywebview/blob/master/examples/js_api.py

↑ 悪くない!

解決策。エラー:ImportError: cannot import name 'PdfFileMerger' from 'pypdf'

解決策。エラー:ImportError: cannot import name 'PdfFileMerger' from 'pypdf'

エラー内容

ImportError: cannot import name 'PdfFileMerger' from 'pypdf' (C:\Users\XYZZZ\AppData\Local\Programs\Python\Python37\lib\site-packages\pypdf\__init__.py)

エラー詳細

C:\_JITAKU_DE_GYOMU\_python_by_chatgpt>python python_shioriY.py
Traceback (most recent call last):
  File "python_shioriY.py", line 2, in <module>
    from pypdf import PdfFileMerger, PdfFileReader, PdfFileWriter
ImportError: cannot import name 'PdfFileMerger' from 'pypdf' (C:\Users\XYZZZ\AppData\Local\Programs\Python\Python37\lib\site-packages\pypdf\__init__.py)

環境

windows10
python3.7.2

対象ソース

from PyPDF2 import PdfFileMerger, PdfFileReader, PdfFileWriter
import os

# 3つのPDFファイルをリストで指定
pdf_files = ["file1.pdf", "file2.pdf", "file3.pdf"]

# マージしたPDFファイルの出力先ファイル名
output_pdf = "merged_file.pdf"

# PdfFileMergerオブジェクトを作成
merger = PdfFileMerger()

# それぞれのPDFファイルを結合
for pdf_file in pdf_files:
    merger.append(pdf_file)

# マージしたPDFファイルを保存
merger.write(output_pdf)
merger.close()

# 作成したPDFファイルにしおりを追加
pdf_writer = PdfFileWriter()
pdf_reader = PdfFileReader(output_pdf)

# ページ数の累積値を取得
cumulative_page_count = 0
for pdf_file in pdf_files:
    pdf = PdfFileReader(pdf_file)
    pdf_title = os.path.splitext(os.path.basename(pdf_file))[0]
    pdf_writer.addBookmark(pdf_title, cumulative_page_count)
    cumulative_page_count += pdf.getNumPages()

# しおりを追加したPDFファイルを保存
with open(output_pdf, "wb") as f:
    pdf_writer.write(f)

解説策

PdfFileMerger ⇒ PdfMerger に変更 PdfFileReader PdfFileWriter も同様に。

他にもエラーでますが、一旦、この記事は閉じます。

関連記事

keep-loving-python.hatenablog.com

ChatGPT(3.5)が「PyPDF2」を使ったコードを作る(薦める)かもしれないが、「pypdf」を使おう!

ChatGPTによるコードの例

素晴らしい!の一言。ChatGPT3.5。
尚、
しおりのページの扱いがおかしかったので、一回、修正してもらった。
ただし、pypdfXのバージョン問題あり(後述)。

from PyPDF2 import PdfFileMerger, PdfFileReader, PdfFileWriter
import os

# 3つのPDFファイルをリストで指定
pdf_files = ["file1.pdf", "file2.pdf", "file3.pdf"]

# マージしたPDFファイルの出力先ファイル名
output_pdf = "merged_file.pdf"

# PdfFileMergerオブジェクトを作成
merger = PdfFileMerger()

# それぞれのPDFファイルを結合
for pdf_file in pdf_files:
    merger.append(pdf_file)

# マージしたPDFファイルを保存
merger.write(output_pdf)
merger.close()

# 作成したPDFファイルにしおりを追加
pdf_writer = PdfFileWriter()
pdf_reader = PdfFileReader(output_pdf)

# ページ数の累積値を取得
cumulative_page_count = 0
for pdf_file in pdf_files:
    pdf = PdfFileReader(pdf_file)
    pdf_title = os.path.splitext(os.path.basename(pdf_file))[0]
    pdf_writer.addBookmark(pdf_title, cumulative_page_count)
    cumulative_page_count += pdf.getNumPages()

# しおりを追加したPDFファイルを保存
with open(output_pdf, "wb") as f:
    pdf_writer.write(f)

環境

windows10
Python 3.7.2

「pypdf」と、「PyPDF2」の関係

以下の記事を参照して下さい。
元々、pypdf で、 PyPDF2というのが出来て(それ自体は活動が終わって?)、
またpypdfに戻った。
よって、pypdfを使うのが適当。

qiita.com

上のコードの問題

ChatGPTの弱点(欠点)だと思うが、
(もの凄い)古いバージョンのメソッドが混ざる(というか、すべて古いバージョンのメソッド。) 解決方法は、以下、参照。

pypdf.readthedocs.io

Pythonでのwhitespaceとは、具体的に何か?

ものすごく厳密に追及するわけではありませんが。。。

リファレンスには、明記されていないと思います。

stringモジュールにwhitespaceというのがあります。

一致するかどうかは不明ですが、それは、すべて含んでいるようです。

検証したコード

import string
print(repr(string.whitespace))
# ' \t\n\r\x0b\x0c'

a = ' \t\n\r\x0b\x0c___uuu___ \t\n\r\x0b\x0c'
print(repr(a))
# ' \t\n\r\x0b\x0c___uuu___ \t\n\r\x0b\x0c'
print(repr(a.strip()))
# '___uuu___'



回答

' \t\n\r\x0b\x0c' は、含まれている感じ。whitespaceを除外するstripで除外されたから。

解決策。Pythonがしれっとプロンプトに戻る2。

はじめて現場をおさえました!!!

ちなみに

しれっとプロンプトに戻ったコードは

import copy

def deep_copy(obj):
    if isinstance(obj, list):
        print("list")
        return [deep_copy(item) for item in obj]
    elif isinstance(obj, dict):
        print("dict")
        return {key: deep_copy(value) for key, value in obj.items()}
    else:
        print("others")
        return copy.copy(obj)

a = {"aaa":999,"bbb":777}
b = [1,2,3,4]
c = 200

a_copy = deep_copy(a)
a_copy_normal = copy.copy(a)
a["bbb"] = 33333
print(a,a_copy,a_copy_normal)

b_copy = deep_copy(b)
b_copy_normal = copy.copy(b)
b[0] = 33333
print(b,b_copy,b_copy_normal)

c_copy = deep_copy(c)
c_copy_normal = copy.copy(c)
c = 33333
print(c,c_copy,c_copy_normal)

解決策

メモリ!!

解決策(続編)。re.error: bad escape \s at position 0(多少、意味のある解読付き)

エラー

環境

windows10
pythonPython 3.10.11

エラー

re.error: bad escape \s at position 0

解決策

rをつけるとか、"\"を増やすとか。。。

検討したソース

import re

print(help(re.sub))
a = 'xyz_opqrstu_\s\t\c'
b = 'dummy'

print("===== yen 1 ====")
print("r-nashi-")
print("moto:",a)
# b = re.sub('\s','\s',a)
# re.error: bad escape \s at position 0
print(" ato:",b)

print("r-ari-")
print("moto:",a)
#b = re.sub('\s',r'\s',a)
#re.error: bad escape \s at position 0
print(" ato:",b)

print("===== yen 2 ====")
print("r-nashi-")
print("moto:",a)
#b = re.sub('\s','\\s',a)
#re.error: bad escape \s at position 0
print(" ato:",b)

print("r-ari-")
print("moto:",a)
b = re.sub('\s',r'\\s',a)
print(" ato:",b)
#moto: xyz_opqrstu_\s    \c
#ato: xyz_opqrstu_\s\s\c


print("===== yen 3 ====")
print("r-nashi-")
print("moto:",a)
b = re.sub('\s','\\\s',a)
print(" ato:",b)
#moto: xyz_opqrstu_\s    \c
# ato: xyz_opqrstu_\s\s\c


print("r-ari-")
print("moto:",a)
# b = re.sub('\s',r'\\\s',a)
# re.error: bad escape \s at position 2
print(" ato:",b)

↑どんどん"\"を足してみて下さい。3個周期???。

実行結果(すみません、print文が適切でないので、、、↑のコードのほうをみて欲しいです。)

===== yen 1 ====
r-nashi-
moto: xyz_opqrstu_\s    \c
 ato: dummy
r-ari-
moto: xyz_opqrstu_\s    \c
 ato: dummy
===== yen 2 ====
r-nashi-
moto: xyz_opqrstu_\s    \c
 ato: dummy
r-ari-
moto: xyz_opqrstu_\s    \c
 ato: xyz_opqrstu_\s\s\c
===== yen 3 ====
r-nashi-
moto: xyz_opqrstu_\s    \c
 ato: xyz_opqrstu_\s\s\c
r-ari-
moto: xyz_opqrstu_\s    \c
 ato: xyz_opqrstu_\s\s\c

解説

どうも、、、re.subの2つ目の引数は、
①最初に文字列としてエスケープ処理される。
②次に、その処理後の文字列の"\"付きの部分がエスケープできるかを判定する。で、"\s"とかは知りません!となる。
なぜか、できないならできないで良いという処理にならない!!!
上記の②の処理が、普通、理解不能だと思う、実装依存というか、実装都合なんでしょう!!!

補足2023/10/08

b = re.sub('\s',r'\\s',a)が良い姿 (python3.7でも同様のはず)

解決策。SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 19-20: truncated \uXXXX escape

エラー

環境

Python 3.10.11 windows10

エラーの内容

SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 19-20: truncated \uXXXX escape

エラー全文

  File "C:\_pythonJISYUTORE\usertest\pre_test00.py", line 1
    a = "C:\_pythonJISYUTORE\usertest"
                                      ^
SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 19-20: truncated \uXXXX escape

エラーが発生するソース

a = "C:\_pythonJISYUTORE\usertest"

解決策

目的にもよりますが、、、
rをつける。

a = r"C:\_pythonJISYUTORE\usertest"

説明

"\u" が特別な意味があるということ。

類似問題

ソース:

a = "C:\_pythonJISYUTORE\aaausertest\xzz"

エラー

SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 31-32: truncated \xXX escape

対策: 同じくr をつける

解説: "\x"が特別な意味がありますということ。