Aujourd'hui, j'essaie de développer une interface utilisateur en utilisant cefpython qui me permet d'intégrer un navigateur web et d'interagir avec les liaisons javascript. Je l'utilise pour développer sur la plate-forme Windows. Pour ce faire, j'utilise le drapeau "multi_threaded_message_loop" qui me permet de gagner en performance. J'utilise aussi wxpython sur python 3 pour l'intégrer.cef python - Freeze lors du redimensionnement
Le problème est lorsque je redimensionne ma fenêtre, l'utilisation de WindowUtils.OnSize() fige mon application. 99% du temps, cela arrive quand le navigateur se charge (mais ça arrive aussi quand c'est fait (rarement)).
Voici un exemple de code pour reproduire:
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()
Merci beaucoup pour votre aide!
Alann
Essayez PostTask pour exécuter OnSize et voir s'il fait la différence. Assurez-vous également que NotifyMoveOrResizeStarted n'est pas à l'origine du problème. –
Merci d'avoir répondu à Czarek! Non ce n'est certainement pas NotifyMoveOrResizeStarted qui cause le problème. J'ai essayé d'exécuter OnSize via un PostTask aussi comme suggéré. Rien ne change, même casse. –
Et si vous supprimez l'appel à OnSize, il ne plante plus? Essayez de retourner True dans cet événement. Voici le code source de OnSize: https://github.com/cztomczak/cefpython/blob/b1156d389b613950109c3e24cbcc21fd9951263c/src/window_utils_win.pyx#L18 - essentiellement quelques appels d'API Windows. Vous pouvez construire à partir de sources et le déboguer. –