我正在使用winxp和wxpython(wxpython 3.1,python 2.6)制作一个GUI程序,该程序将从TextCtrl中复制文本到包含StaticText的ScrollablePanel中。这一切都很顺利,但是滚动部分的工作不太对。它似乎无法实时更新。当我最小化窗口然后再次最大化时,滚动条会更新。但是,如果我再次在TextCtrl中开始输入(因此使用事件向ScrollablePanel内部的StaticText添加文本),则面板上的滚动条不会更新,除非我再次最小化等。
所以问题是,如何实时更新ScrolledPanel?我已经设置了一个事件等待TextCtrl中的文本更改,这就是我认为需要进行更新的地方。我尝试过Update、Refresh和Layout,但它们似乎没有什么用。更大的问题是,最小化窗口并再次最大化会做什么,而Update、Refresh和Layout却不能做到呢?谢谢你的帮助。抱歉我不能发布代码,因为它是保密的。我会感激您能给我的任何帮助。通常情况下,我可以通过搜索自己找出问题,但我还没有找到关于这种事情的任何文档。这是我第一次遇到这种情况,但我从您的答案中得到了很多帮助。再次感谢! :)
补充:
所以问题是,如何实时更新ScrolledPanel?我已经设置了一个事件等待TextCtrl中的文本更改,这就是我认为需要进行更新的地方。我尝试过Update、Refresh和Layout,但它们似乎没有什么用。更大的问题是,最小化窗口并再次最大化会做什么,而Update、Refresh和Layout却不能做到呢?谢谢你的帮助。抱歉我不能发布代码,因为它是保密的。我会感激您能给我的任何帮助。通常情况下,我可以通过搜索自己找出问题,但我还没有找到关于这种事情的任何文档。这是我第一次遇到这种情况,但我从您的答案中得到了很多帮助。再次感谢! :)
补充:
import wx
import wx.lib.inspection
from wx.lib.scrolledpanel import ScrolledPanel
class MyFrame( wx.Frame ):
# TODO: add all class variables here for convention
tin = None
hsizer = None
def __init__( self, parent, ID, title ):
wx.Frame.__init__( self, parent, ID, title,
wx.DefaultPosition, wx.Size( 200, 150 ) )
self.InitWidgets()
self.InitBindings()
self.InitFinish()
def InitWidgets( self ):
self.hsizer = wx.BoxSizer( wx.HORIZONTAL )
# Add the TextCtrl
vsizer = wx.BoxSizer( wx.VERTICAL )
self.tin = wx.TextCtrl( self, style=wx.TE_MULTILINE )
vsizer.Add( self.tin, 1, wx.EXPAND )
self.hsizer.Add( vsizer, 3, wx.TOP|wx.LEFT|wx.BOTTOM|wx.EXPAND, border=20 )
# Add ScrolledPanel widget
self.hsizer.Add( wx.Size( 200, -1 ), 1 )
vsizer2 = wx.BoxSizer( wx.VERTICAL )
self.test_panel = ScrolledPanel( self )
self.test_panel.SetupScrolling()
# Setup static text ( label ) tvs is the
# vertical sizer inside the panel
self.tvs = wx.BoxSizer( wx.VERTICAL )
self.tin2 = wx.StaticText( self.test_panel )
self.tvs.Add( self.tin2, 0, wx.EXPAND )
vsizer2.Add( self.test_panel, 1, wx.EXPAND )
self.hsizer.Add( vsizer2, 3, wx.TOP|wx.LEFT|wx.BOTTOM|wx.EXPAND, border=20 )
# Add Spacer
self.hsizer.Add( wx.Size( 500, -1 ), 1 )
def InitBindings( self ):
self.tin.Bind( wx.EVT_TEXT, self.TextChange )
def InitFinish( self ):
# Setup sizers and frame
self.SetAutoLayout( True )
self.test_panel.SetAutoLayout( True )
self.test_panel.SetSizer( self.tvs )
self.SetSizer( self.hsizer )
self.Layout()
self.Update()
self.Maximize()
def TextChange( self, event ):
#self.CopyValues()
self.tin2.Label = self.tin.GetValue()
self.Layout()
self.Update()
self.test_panel.Refresh()
self.test_panel.Update()
print self.tin.GetValue().split( "\n" )
class MyApp( wx.App ):
fr = None
def OnInit( self ):
self.fr = MyFrame( None, -1, "TitleX" )
self.fr.Show( True )
self.SetTopWindow( self.fr )
return True
app = MyApp( 0 )
app.MainLoop()
def main():
win = 1
if ( __name__ == "__main__" ):
main()
通常情况下,这就是程序的目的,不需要过多的解释。我设置了虚拟大小,希望这会使面板的大小大于它填充的区域,以期获得永久滚动条,但事实并非如此。