wxPython を使用してファイルをロードする際に問題が発生しました。使用例は、これらのファイル/スニップがコンピューターのフォルダーにある場合です。スニップは、元の html ファイルの小さなセクションです。多くの場合、スニップは抽出されたテーブルであり、テーブルの周りに html タグと body タグが含まれています。
<html><body><table>
~tr and td tags with stuff in them
</table></body><<html>
ユーザーは SmartBrowser (私たちのアプリケーション) を使用してフォルダーに移動し、フォルダー内の htm および txt ファイルのリストを作成し、最初のファイルを表示します。リスト内を移動するためのコントロールがあります (次と前)
このシステムは、数年間、ほとんど問題なく機能していました。特定のスニップが読み込まれているときに、SmartBrowser (スニップを表示できるアプリケーションの名前) が突然クラッシュし始めました。最終的に問題を切り分けて、クラッシュが発生していると判断しました
- ファイルに table タグがある場合
- テーブル内の 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に注意してください。