1

wxPython でチャットルーム クライアントを作成していwx.HtmlWindowsます。ノートブック ページのチャットルームごとに 3 つあります。1 つはメッセージ用、もう 1 つはルームのタイトル用、もう 1 つはルームのトピック用です (2 つの類似したもの)。

プログラムは正常に動作し、画像がメッセージのコードに含まれている場合などに画像を読み込みます。 50x50 - 100x100) 場合によってはロックアップし、時間がかかりすぎてプログラムが応答しないことがあるため、問題になる可能性があります。問題は、どうすればロックアップを防ぐことができるかということです。wx.HtmlWindowプログラムがイメージのロードを続行するのを待たなければならないのではなく、binding のイメージのロードを行って、イメージをワーカースレッドに動的にロードする方法がわかりません。

私が書いているサンプルコードが必要な場合はお知らせください。

編集:私はまだこれに対する答えを見つけるのに苦労しています..このため、このプロジェクトのどこにも文字通り行きませんでした。私のアプリケーションは、メッセージ/画像をロックせずに動的にロードできる必要があり、ローダースレッドのロード中に画像のフレームとメッセージが表示されるように、画像を別のスレッドに強制的にロードする方法がわかりません画像を更新し、完了したら空のフレームを更新します。これはすべて HtmlWindow で行う必要があります。画像の読み込みに関しては、実際の Web ブラウザーのように動作するようにしたい (フレームが表示され、画像がゆっくりと表示される)

4

4 に答える 4

0

Mike の回答 (彼の言うとおり) に加えて、HTMLWindow の OnOpeningURL メソッドをオーバーライドし、wx.html.HTML_URL_IMAGE.

参照:説明については、これらの wx docsを参照してください。

于 2010-09-29T16:06:43.207 に答える
0

プロセスが長時間実行されると、アプリケーションのメイン ループがブロックされ、「ロックアップ」が発生します。別のスレッドでダウンロードを行い、完了したら UI を更新する必要があります。スレッド (およびその他の方法) の使用に関するいくつかのリンクを次に示します。

http://wiki.wxpython.org/LongRunningTasks

http://www.blog.pythonlibrary.org/2010/05/22/wxpython-and-threads/

于 2010-09-29T13:41:49.343 に答える
0

Steven Sproat は正しい軌道に乗っていました (私を乗せてくれたことに感謝します - あなたの提案がなければそれを行うことはできませんでした) - 完全な解決策の関連部分を次に示します。

import wx.html as html
import urllib2 as urllib2
import os
import tempfile
import threading
from Queue import Queue

class HTTPThread(threading.Thread):
     def __init__(self, urlQueue, responseQueue):
        threading.Thread.__init__(self)
        self.urlQueue = urlQueue
        self.responseQueue = responseQueue

    def run(self):
        # add error handling
        url = self.urlQueue.get()
        request = urllib2.Request(url)
        response = urllib2.urlopen(request)
        page = response.read()
        self.responseQueue.put(page)

そして、html.HtmlWindow の派生クラスで:

def OnOpeningURL(self, type, url):
    if type == html.HTML_URL_IMAGE:
        # If it is a tempfile already, just tell it to open it.
        # Since it will be called again
        # immediately after first failure only need to keep the last
        # temp file within the object, and the former is closed!
        if self.f is not None and self.f.name in url:
            return html.HTML_OPEN
        # if its not a tempfile, download asynchronously and redirect
        urlq = Queue()
        resq = Queue() 
        t = HTTPThread(urlq, resq)
        t.start()
        urlq.put_nowait(url)
        while True:
            if resq.empty():
                # your task while waiting
                time.sleep(0.1)
            else:
                img = resq.get()
                break
        self.f = tempfile.NamedTemporaryFile()
        self.f.write(img)
        self.f.seek(0)
        return 'file://' + self.f.name
    else:
        return html.HTML_OPEN

私のアプリケーションでは、これはうまく機能しますが、本当に「通常の Web ブラウザのように」画像をロードしたい場合は、wx.html.HtmlWindow 以上のものが必要になります。ただし、これはノンブロッキングであり、画像を正しくロードします。

于 2013-03-14T17:29:44.697 に答える
0

最新の wxPython 開発リリースで新しい機能を試してみませんか?

最初に、最新バージョンをダウンロードしてインストールしたことを確認する必要があります。ここの「開発リリース」の下にあります: http://www.wxpython.org/download.php

これは、最新の wxPython(v2.9) 開発リリースで動作する簡単な例です:

import wx 
import wx.html2 

class MyBrowser(wx.Dialog): 
  def __init__(self, *args, **kwds): 
    wx.Dialog.__init__(self, *args, **kwds) 
    sizer = wx.BoxSizer(wx.VERTICAL) 
    self.browser = wx.html2.WebView.New(self) 
    sizer.Add(self.browser, 1, wx.EXPAND, 10) 
    self.SetSizer(sizer) 
    self.SetSize((700, 700)) 

if __name__ == '__main__': 
  app = wx.App() 
  dialog = MyBrowser(None, -1) 
  dialog.browser.LoadURL("http://www.google.com") 
  dialog.Show() 
  app.MainLoop()

これで問題が解決することを願っています。お知らせください。

于 2012-06-04T21:31:04.987 に答える