【问题标题】:Why simple wxPython application looks broken on the start?为什么简单的 wxPython 应用程序一开始看起来就坏了?
【发布时间】:2012-02-29 12:22:47
【问题描述】:

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

这是第一个。 我在框架上制作了一些控件的布局,并在应用程序启动后立即看到布局被破坏。但是在调整应用程序窗口的大小之后,它就像我设计的一样......几乎 然后我使用 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()”的末尾。在这两种情况下,应用程序看起来都还不错

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

【问题讨论】:

    标签: python wxpython


    【解决方案1】:

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

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

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

    更新:

    布局基本上使小部件自行布局。它有点强迫刷新。 Fit 将使它们占用最小的空间。我不确定为什么框架的布局在这种情况下在您的机器上不起作用。正如我所提到的,它对我来说很好。在 wxPython 邮件列表中询问以获得完整的答案,因为这就是 wx 开发人员所在的位置。

    【讨论】:

    • 我正在使用 Python2.7('2.7 (r27:82525, Jul 4 2010, 07:43:08) [MSC v.1500 64 bit (AMD64)]')和 wxPython 2.8。 12.1.稍后我会尝试建议的。将提供结果...
    【解决方案2】:

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

    【讨论】:

    • 我遇到了 Fit 问题,它使小部件太小或以不可预知的方式弄乱了我的布局。我通常在我的程序中避免它。祝你好运!
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多