我正在尝试基于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()
================================
更新
所以我发现了:
窗口小部件检查工具显示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()不能完成它的工作?
答案 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()))