为什么简单的wxPython应用程序在开始时看起来很糟糕?

时间:2012-02-29 12:22:47

标签: python wxpython

我正在尝试基于wxPython创建我的第一个简单但真实的应用程序。而且我面临许多奇怪的事情,这些事情在wxPython主页上的基础教程中没有说明。 这里

这是第一个。 我对框架进行了一些控制布局,并在应用程序启动后立即看到布局被破坏。但是在调整applocation的窗口大小之后,它变得像我设计的......差不多 那么我使用wxGlade生成代码,我遇到了同样的问题。 这是一个视频,可以提供我遇到http://screencast.com/t/COmqye7dlwzA

时遇到的问题的详细信息

正如你在调整大小后所看到的那样变得更好,但它仍然在面板'panel_3'的左上角有一些奇怪的元素

这是由wxGlade生成的代码:

#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-
# generated by wxGlade 0.6.5 (standalone edition) on Wed Feb 29 14:03:09 2012

import wx

# begin wxGlade: extracode
# end wxGlade


class MyFrame(wx.Frame):
    def __init__(self, *args, **kwds):
        # begin wxGlade: MyFrame.__init__
        kwds["style"] = wx.DEFAULT_FRAME_STYLE
        wx.Frame.__init__(self, *args, **kwds)
        self.panel_2 = wx.Panel(self, -1)
        self.text_ctrl_3 = wx.TextCtrl(self.panel_2, -1, "")
        self.text_ctrl_3_copy = wx.TextCtrl(self.panel_2, -1, "")
        self.text_ctrl_3_copy_1 = wx.TextCtrl(self.panel_2, -1, "")
        self.button_2 = wx.Button(self.panel_2, -1, "button_2")
        self.panel_3 = wx.Panel(self.panel_2, -1)

        self.__set_properties()
        self.__do_layout()
        # end wxGlade

    def __set_properties(self):
        # begin wxGlade: MyFrame.__set_properties
        self.SetTitle("frame_1")
        self.SetSize((519, 333))
        self.text_ctrl_3.SetMinSize((50, -1))
        self.text_ctrl_3_copy.SetMinSize((50, -1))
        self.text_ctrl_3_copy_1.SetMinSize((50, -1))
        self.panel_3.SetBackgroundColour(wx.Colour(255, 255, 255))
        # end wxGlade

    def __do_layout(self):
        # begin wxGlade: MyFrame.__do_layout
        sizer_1 = wx.BoxSizer(wx.HORIZONTAL)
        main_sizer_0 = wx.BoxSizer(wx.HORIZONTAL)
        vsizer_left_1 = wx.BoxSizer(wx.VERTICAL)
        hsizer_params_2 = wx.BoxSizer(wx.HORIZONTAL)
        hsizer_params_2.Add(self.text_ctrl_3, 0, wx.LEFT | wx.RIGHT | wx.TOP, 5)
        hsizer_params_2.Add(self.text_ctrl_3_copy, 0, wx.LEFT | wx.RIGHT | wx.TOP, 5)
        hsizer_params_2.Add(self.text_ctrl_3_copy_1, 0, wx.LEFT | wx.RIGHT | wx.TOP, 5)
        vsizer_left_1.Add(hsizer_params_2, 0, wx.EXPAND, 0)
        vsizer_left_1.Add(self.button_2, 0, wx.ALL | wx.ALIGN_CENTER_HORIZONTAL, 5)
        main_sizer_0.Add(vsizer_left_1, 0, wx.EXPAND, 0)
        main_sizer_0.Add(self.panel_3, 1, wx.ALL | wx.EXPAND, 5)
        self.panel_2.SetSizer(main_sizer_0)
        sizer_1.Add(self.panel_2, 1, wx.EXPAND, 0)
        self.SetSizer(sizer_1)
        self.Layout()
        # end wxGlade

# end of class MyFrame
if __name__ == "__main__":
    app = wx.PySimpleApp(0)
    wx.InitAllImageHandlers()
    frame_1 = MyFrame(None, -1, "")
    app.SetTopWindow(frame_1)
    frame_1.Show()
    app.MainLoop()

================================

更新

所以我发现了:

  1. 窗口小部件检查工具显示panel_3将panel_2作为父级。我认为这是正确的

  2. 如果我将'sizer_1.Layout()'放在__do_layout方法中的'self.Layout()'之前,它会解决所有问题。 panel_3的左上角没有奇怪的东西。我认为这是第一个TextControl留下的标记

  3. 另一个有趣的方法是我可以删除'self.Layout()'并且应用程序看起来仍然会很好。

  4. 此外,我已经尝试将__do_layout方法放在'self.panel_2.Fit()'或'self.panel_2.Layout()'的末尾。在这两种情况下,应用程序仍然看起来很好

  5. 我读过Fit()并发现它与Layout()类似。我错了吗 ?它们之间有什么区别?哪种方法更好?为什么我需要在框架中布置顶部元素以使应用程序看起来正确并且Frame.Layout()不能完成它的工作?

3 个答案:

答案 0 :(得分:1)

我无法在Windows 7,wxPython 2.9.3.1,Python 2.6.6上复制此问题。但是,当您看到可以调整框架大小并使所有内容都弹出到位的问题时,这通常意味着您需要在某处放置Layout()调用。通常,您只需在显示之前调用框架或顶级sizer的Layout()命令。

看起来你已经拥有了这个。 panel_3中的奇怪小部件看起来像是有错误的父级,但是因为我在运行它时没有看到这个问题,所以我无法诊断它。幸运的是,有一个小部件检查工具,您可以使用它来找出布局问题和许多其他事情。这是一个链接:http://wiki.wxpython.org/Widget%20Inspection%20Tool

您应该能够使用它来找出哪个小部件以及它的父级。这将为您提供修复它所需的信息。

更新:

布局基本上使小部件自成一体。它有点强迫刷新。适合将使他们占用最小的空间。我不确定为什么在你的机器上框架的布局不适用于这种情况。正如我所提到的,它对我来说很好。在wxPython邮件列表上询问获得完整答案,因为这是wx开发人员的所在。

答案 1 :(得分:1)

尝试在self.panel_2.Fit()之前致电self.Layout()。同样在这里使用Fedora和Linux上的wxPython似乎在没有明确调用Fit()的情况下计算布局错误。

答案 2 :(得分:0)

我最近(问了问题7年后...)遇到了同样的问题。打开程序时,我的某些文本输入显示为灰色或仅呈现了一半,但是调整大小后一切都很好。我将此行添加到了我的框架中(添加了所有小部件和布局之后),现在看起来还不错:

self.ProcessEvent(wx.SizeEvent(self.GetSize()))

相关问题