1

wxPython を使用してファイルをロードする際に問題が発生しました。使用例は、これらのファイル/スニップがコンピューターのフォルダーにある場合です。スニップは、元の html ファイルの小さなセクションです。多くの場合、スニップは抽出されたテーブルであり、テーブルの周りに html タグと body タグが含まれています。

<html><body><table>
    ~tr and td tags with stuff in them
</table></body><<html>

ユーザーは SmartBrowser (私たちのアプリケーション) を使用してフォルダーに移動し、フォルダー内の htm および txt ファイルのリストを作成し、最初のファイルを表示します。リスト内を移動するためのコントロールがあります (次と前)

このシステムは、数年間、ほとんど問題なく機能していました。特定のスニップが読み込まれているときに、SmartBrowser (スニップを表示できるアプリケーションの名前) が突然クラッシュし始めました。最終的に問題を切り分けて、クラッシュが発生していると判断しました

  1. ファイルに table タグがある場合
  2. テーブル内の td 要素に幅属性 (WIDTH=) がある場合

width 属性を意味のない単語 (たとえばバナナ) に変更すると、すべてが正常に表示され、プログラムはクラッシュしませんが、width 属性が存在する場合、実行中のコマンド コンソールに次のエラー メッセージが表示され、デバッグしようとします。

こんにちは。

Traceback (most recent call last):
  File "gui\smart_browser.pyo", line 286, in onOpen
  File "gui\smart_browser.pyo", line 219, in browseTo
  File "gui\smart_browser.pyo", line 170, in update
  File "gui\smart_browser.pyo", line 231, in loadUrl
  File "wx\html.pyo", line 1008, in LoadPage
wx._core.PyAssertionError: C++ assertion "(size_t)(n) <= length()" failed at ..\
..\include\wx/string.h(433) in wxStringBase::at(): invalid index in wxString

もう一度強調させてください - この動作は最近現れたばかりです - 私たちは WxPython 2.9 に移行しましたが、それが原因かどうかを確認するために 2.8 にロールバックしましたが、動作の違いは見られませんでした。

だから私はwx\html.pyのエラーメッセージで関数を見つけました

def LoadPage(*args, **kwargs):
   """LoadPage(self, String location) -->bool"""
    return _html.HTMLWindow_LoadPage(*args, **kwargs)

_htmlただし、プログラムpydが_html からインポートされていることがわかり、ここで許してくださいdll

WIDTH 属性が原因でエラーが発生する理由がWxWidgetsサイトで調べてもわからず、この組み合わせが問題になるという証拠が見つからないため、次に何をすべきかわかりません。次に何を見ればいいのかわからない。

具体的には、この問題を解決するために何を読む必要があるかについての提案を探しています。おそらく、これを外部で処理する必要があるか、私のスキルを持っている人にとっては怖いと思われるものにWx入る必要があるかを示しています.Wx

さて、Mike Driscoll の回答に基づいてさらに追加します。コードにはこれがありました

try:
    from wx.lib.iewin import IEHtmlWindow as HtmlWindow
    LOAD_URL_FUNC_NAME = 'LoadUrl'
    GET_URL_PROPERTY_NAME = "locationurl"
except:
    from wx.html import HtmlWindow
    LOAD_URL_FUNC_NAME = 'LoadPage'
    GET_URL_PROPERTY_NAME = "OpenedPage"

そして、彼はまさに正しかったので、条件付きインポートをコメントアウトし、さらに調査した後、必要であると判断しました

from wx.lib.iewin_old import IEHtmlWindow as HtmlWindow

IEHtmlWindowを使用していると想定していたiewin_oldに注意してください。

4

1 に答える 1

1

あなたが示している小さなコードからは確かなことはわかりませんが、HTMLWindow を使用していると思います。HTMLWindow ウィジェットは限られた HTML タグのセットでしか機能しないため、その属性に満足していないと推測されます。基本的に次の 2 つのオプションがあると思います。

  • lxmlやbeautifulsoupなどを使用してwxPythonで開く前に、問題のある要素を取り除きます
  • wx.html2 の webview など、より堅牢な HTML ウィジェットを使用する

wxPython の Google グループ / ユーザー リストで他の提案を求めることもできます。

于 2013-11-12T20:14:16.583 に答える