【发布时间】: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()
=================================
更新
所以我发现了什么:
小部件检查工具显示 panel_3 有 panel_2 作为父级。我认为是正确的
如果我将 'sizer_1.Layout()' 放在 __do_layout 方法中的 'self.Layout()' 之前,它会解决所有问题。而且 panel_3 的左上角也没有什么奇怪的东西。我认为这是第一个 TextControl 留下的标记
另一个有趣的事情是我可以删除 'self.Layout()' 并且应用程序看起来仍然很好。
我还尝试将 __do_layout 方法放在“self.panel_2.Fit()”或“self.panel_2.Layout()”的末尾。在这两种情况下,应用程序看起来都还不错
我读过 Fit() 并发现它与 Layout() 有类似的作用。我错了吗 ?它们之间有什么区别?哪种方法更好?为什么我需要在框架中布局顶部元素以使应用程序看起来正确而 Frame.Layout() 不能完成它的工作?
【问题讨论】: