TextCtrl滚动条无法使用,直到调整窗口大小

时间:2013-04-10 16:33:56

标签: python wxpython

解决: 感谢Aya在下面的回答,我现在知道这个问题是由第18行的self.panel = wx.Panel(self, -1)引起的。我创建了一个小组,并没有附加任何内容。原始问题描述仍在下面供参考。

我的Google-fu让我失望了。我正在构建你可以在这里找到的文本编辑器,用Python编写,带有wxPython:

https://github.com/joshsaintjacque/py-ed/blob/master/pyed.py

我遇到的问题是这样的:当我打开一个文本文件(此时内置的唯一功能),它比TextCtrl中的可视区域大时滚动条保持禁用状态,直到窗口重新显示为止。大小,然后它工作正常。

我知道重新调整窗口大小的行为正在运行一些命令,我​​忽略了包含在我的OpenFile函数中(或者可能在 init 中),但我无法弄清楚什么。 任何有任何想法可以引导我朝正确方向发展的想法都将不胜感激。

谢谢!

2 个答案:

答案 0 :(得分:2)

+1包含完整源代码的链接 - 使测试更加容易。

我无法在Win32上重现您在wxPython 2.8.12上描述的错误,但在运行代码时,我发现在wx.Panel第18行创建了一个看似无关的pyed.py对象...

self.panel = wx.Panel(self, -1)

......这似乎干扰了程序的正确操作。在评论出该行之后,似乎工作正常。


我注意到的其他几件事:第56行......

self.SetTitle("PyEd - Editing ... " + filename)

...应该放在前面的if-block中,否则如果用户点击wx.FileDialog上的“取消”,第16行就会收到错误...

wx.Frame.__init__(self, parent, id, 'PyEd', (-1, -1), wx.Size(640, 480))

...如果你使用关键字args而不是位置args ......

wx.Frame.__init__(self, parent=parent, id=id, title='PyEd', size=wx.Size(640, 480))

...如果wxPython开发人员决定更改未来版本中的默认值,您无需费心重新指定窗口位置的默认值,这也稍微更安全。

您还可以分解常量值,并可选择创建wx.Size对象以将该行减少为...

wx.Frame.__init__(self, parent=None, title='PyEd', size=(640, 480))

最后,关于ID:在大多数情况下,您可能会发现它们没什么用处。它们派上用场的地方就是你想要许多类似控件的地方,并且通过单个事件处理函数处理它们更有意义。

考虑这个例子......

def create_buttons(parent):
    parent.button1 = wx.Button(label='Button 1')
    parent.button2 = wx.Button(label='Button 2')
    parent.button3 = wx.Button(label='Button 3')

    parent.button1.Bind(wx.EVT_BUTTON, on_button_1)
    parent.button2.Bind(wx.EVT_BUTTON, on_button_2)
    parent.button3.Bind(wx.EVT_BUTTON, on_button_3)

def on_button_1(event):
    print 'You clicked button 1'

def on_button_2(event):
    print 'You clicked button 2'

def on_button_3(event):
    print 'You clicked button 3'

...这很好,但是如果你需要100个按钮,你可能更愿意像这样实现它......

def create_buttons(parent):
    parent.buttons = [wx.Button(id=i, label='Button %d' % i) for i in range(100)]
    parent.Bind(wx.EVT_BUTTON, on_button)

def on_button(event):
    button_id = event.GetId()
    print 'You clicked button %d' % button_id

哦,小心使用id作为变量名,因为它也是Python内置函数名。

答案 1 :(得分:0)

看起来好像你没有为窗口设置最小或最大尺寸提示,也没有调用Self.Fit()使框尺寸调整器符合窗口大小(或者反之亦然?我的wxPython生锈了......)

如果您调用self.SetSizer(sizer),您应该可以通过添加以下内容来解决此问题:

self.Fit()
self.SetSizeHintSz(minSize=wx.Size(640, 480))

您可以使用self.SetSizerAndFit()

绕过对self.Fit()的单独调用

(为拼写编辑。)