"窗口大小调整后,TextCtrl滚动条无法使用"

2024-04-29 13:47:42 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

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

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

谢谢!在


Tags: pyhttpsselfgithubcom面板wxpython文本编辑
2条回答

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

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

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

…这似乎妨碍了程序的正确运行。在把那句话注释掉之后,它似乎工作得很好。在


我还注意到其他一些事情:56号线。。。在

^{pr2}$

…可能应该放在前面的if块中,否则如果用户在wx.FileDialog上单击“Cancel”并在第16行上单击“Cancel”,您将得到一个错误。。。在

^{3}$

…如果使用关键字参数而不是位置参数。。。在

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

看起来好像您没有为窗口设置最小或最大大小提示,也没有调用Self.Fit()来调整框大小以适应窗口大小(或者是相反吗?我的wxPython生锈了…)

就在你打电话的地方自调整器(sizer),您应该能够通过添加以下内容来解决此问题:

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

你也许可以绕过单独的电话自我。适合()使用self.SetSizerAndFit()

(为拼写编辑。)

相关问题 更多 >