2017-04-04 19 views
2

今日私は、ウェブブラウザを埋め込み、それにjavascriptバインディングで相互作用するcefpythonを使用してUIを開発しようとしています。cef python - サイズ変更時フリーズ

私はWindowsプラットフォームで開発するために使用しています。 この目的のために、私は "multi_threaded_message_loop"フラグを使用してパフォーマンスを向上させています。 私はまた、Python 3にwxpythonを使ってそれを埋め込みました。

問題は私のウィンドウのサイズを変更すると、WindowUtils.OnSize()の使用は私のアプリケーションをフリーズさせます。時間の99%は、ブラウザがロードされているときに発生します(ただし、完了したら(まれに)発生します)。ここで

は再現するサンプルコードです:

import platform 
import sys 

import wx 
from cefpython3 import cefpython 

WindowUtils = cefpython.WindowUtils() 

WIDTH = 800 
HEIGHT = 600 

import os 

class MainFrame(wx.Frame): 
    browser = None 
    mainPanel = None 

    def createMainBrowser(self): 
     self.browser = self.createBrowser(self.mainPanel) 

    def createBrowser(self, parent): 
     browser = cefpython.CreateBrowserSync(
      self.getWindowInfo(parent), 
      browserSettings={}, 
      navigateUrl='http://www.google.com' 
     ) 
     return browser 

    def getWindowInfo(self, parent): 
     windowInfo = cefpython.WindowInfo() 
     windowInfo.SetAsChild(parent.GetHandle(), [0, 0, WIDTH, HEIGHT]) 
     return windowInfo 

    def __init__(self): 
     wx.Frame.__init__(
      self, parent=None, id=wx.ID_ANY, title='wx', size=(WIDTH, HEIGHT) 
     ) 
     self.mainPanel = wx.Panel(self) 
     self.mainPanel.SetBackgroundColour(wx.GREEN) 

     cefpython.PostTask(cefpython.TID_UI, self.createMainBrowser) 

     self.mainPanel.Bind(wx.EVT_SIZE, self.OnSize) 

    def OnSize(self, _): 
     if not self.browser: 
      return 

     WindowUtils.OnSize(self.mainPanel.GetHandle(), 0, 0, 0) 
     self.browser.NotifyMoveOrResizeStarted() 


class App(wx.App): 
    def OnInit(self): 
     frame = MainFrame() 
     frame.Show() 
     return True 

if __name__ == '__main__': 
    sys.excepthook = cefpython.ExceptHook # To shutdown all CEF processes on error 
    cefpython.Initialize({ 
     "locales_dir_path": cefpython.GetModuleDirectory() + "/locales", 
     "browser_subprocess_path": cefpython.GetModuleDirectory() + "/subprocess", 
     "auto_zooming": "system_dpi", 
     "multi_threaded_message_loop": True, 
    }) 
    app = App(False) 
    app.MainLoop() 
    cefpython.Shutdown() 

はあなたの助けをたくさんありがとうございました!

アラン

+0

PostTaskを使用してOnSizeを実行し、違いがあるかどうかを確認してください。また、NotifyMoveOrResizeStartedが問題の原因でないことを確認してください。 –

+0

Czarekに答えるためのThx! NotifyMoveOrResizeStartedは問題を引き起こしていません。私は、提案されたようにPostTaskを介してOnSizeを実行しようとしました。何も変わらず、同じクラッシュ。 –

+0

OnSizeへの呼び出しを削除しても、それはもはやクラッシュしませんか?そのイベントでTrueを返してみてください。 OnSizeのソースコードは次のとおりです。https://github.com/cztomczak/cefpython/blob/b1156d389b613950109c3e24cbcc21fd9951263c/src/window_utils_win.pyx#L18 - 基本的にはいくつかのWindows API呼び出しです。ソースからビルドしてデバッグすることができます。 –

答えて

1

問題が解決しました! 代わりの

def OnSize(self, _): 
    if not self.browser: 
     return 

    WindowUtils.OnSize(self.mainPanel.GetHandle(), 0, 0, 0) 
    self.browser.NotifyMoveOrResizeStarted() 

を使用して、私は窓10上だが、おそらくWindowsUtilsを更新する必要があるためである場合、私は知らない

def OnSize(self, sizeEvent): 
    if not self.browser: 
     return 

    w = sizeEvent.GetSize().GetWidth() 
    h = sizeEvent.GetSize().GetHeight() 
    win32gui.SetWindowPos(self.browser.GetWindowHandle(), 0, 0, 0, w, h, 0) 
    self.browser.NotifyMoveOrResizeStarted() 

を使用!

+0

マルチスレッドメッセージループがFalseに設定されていると、フリーズの問題は発生しません。 –

関連する問題