1

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

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

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

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

我知道重新调整窗口大小的行为正在运行一些我忽略包含在我的 OpenFile 函数(或者可能在init)中的命令,但我不知道是什么。任何人的任何想法都可以引导我朝着正确的方向前进,我们将不胜感激。

谢谢!

4

2 回答 2

2

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

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

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

...这似乎干扰了程序的正确运行。在注释掉那行之后,它似乎工作正常。


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

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

...应该放在前面的 if 块中,否则如果用户wx.FileDialog在第 16 行和第 16 行单击“取消”,则会出现错误...

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

...如果您使用关键字参数而不是位置参数...

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 内置的函数名。

于 2013-04-11T10:46:05.060 回答
0

看起来好像您没有设置窗口的最小或最大大小提示,也没有调用Self.Fit()将 box sizer 调整到窗口大小(或者相反?我对我的 wxPython 生锈了。 .)

在你调用 self.SetSizer(sizer) 的地方,你应该可以通过添加来解决这个问题:

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

您可以通过使用来绕过对 self.Fit() 的单独调用self.SetSizerAndFit()

(编辑拼写。)

于 2013-04-10T17:16:47.573 回答