我希望能够调整HTML窗口,但保留滚动位置。 这个例子几乎工作,但闪烁。
去测试:
- 使用加载HTML文件按钮加载一个大小合适的HTML文件
- 向下滚动
- 调整窗口的大小。
该窗口保持其相同的位置通过调整大小,但它可怕的闪烁。 对于htmlwindow的代码重置滚动位置为0每个调整,我想。 我想保持它,直到重绘滚动位置被固定在post_resize功能。
我试过冻结/解冻的各种组合,并试图钩到油漆事件,但没有成功。 建议?
import wx
import wx.html
_POST_RESIZE_EVENT = wx.NewEventType()
class _PostResizeEvent(wx.PyEvent):
def __init__(self, pos):
wx.PyEvent.__init__(self)
self.SetEventType(_POST_RESIZE_EVENT)
self.pos = pos
def EVT_POST_RESIZE(win, func):
win.Connect(-1, -1, _POST_RESIZE_EVENT, func)
class MyHtmlPanel(wx.Panel):
"""
class MyHtmlPanel inherits wx.Panel and adds a button and HtmlWindow
"""
def __init__(self, parent, id):
# default pos is (0, 0) and size is (-1, -1) which fills the frame
wx.Panel.__init__(self, parent, id)
self.SetDoubleBuffered(True)
self.SetBackgroundColour("yellow")
self.html1 = wx.html.HtmlWindow(self, id, pos=(0,30), size=(602,310))
self.btn1 = wx.Button(self, -1, "Load Html File", pos=(0,0))
self.btn1.Bind(wx.EVT_BUTTON, self.OnLoadFile)
self.btn2 = wx.Button(self, -1, "Clear Page", pos=(120,0))
self.btn2.Bind(wx.EVT_BUTTON, self.OnClearPage)
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(self.btn1, 0)
sizer.Add(self.btn2, 0)
sizer.Add(self.html1, 1, wx.EXPAND)
self.SetSizer(sizer)
self.html1.Bind(wx.EVT_SCROLLWIN, self.OnScroll)
self.Bind(wx.EVT_SIZE, self.OnSize)
EVT_POST_RESIZE(self.html1, self.post_resize)
self.hist=0
def OnScroll(self, evt):
self.hist = self.html1.GetViewStart()[1]
evt.Skip()
def OnSize(self, evt):
wx.PostEvent(self.html1, _PostResizeEvent(self.hist))
evt.Skip()
def post_resize(self, evt):
self.html1.Scroll(0, evt.pos)
def OnLoadFile(self, event):
dlg = wx.FileDialog(self, wildcard = '*.html', style=wx.OPEN)
if dlg.ShowModal():
path = dlg.GetPath()
self.html1.LoadPage(path)
dlg.Destroy()
def OnClearPage(self, event):
self.html1.SetPage("")
app = wx.PySimpleApp()
# create a window/frame, no parent, -1 is default ID, title, size
frame = wx.Frame(None, -1, "HtmlWindow()", size=(610, 380))
# call the derived class, -1 is default ID
MyHtmlPanel(frame,-1)
# show the frame
frame.Show(True)
# start the event loop
app.MainLoop()