2012-02-29 3 views
0

私はwxPythonに基づいて最初のシンプルだが実際のアプリケーションを作成しようとしています。そして私はwxPythonのホームサイトの基本的なチュートリアルでは書かれていない多くの奇妙なことに直面しています。 ここになぜ単純なwxPythonアプリケーションが最初に壊れて見えるのですか?

ここは最初のものです。 フレーム上で何らかのコントロールのレイアウトを作成し、アプリケーションの開始直後にレイアウトが破損していることを確認しました。しかし、直ぐにアプリケーションのウィンドウのサイズを変更した後は、私が設計したようになりました...ほぼ それでは、wxGladeを使ってコードを生成しましたが、同じ問題が発生しました。 は、ここで私はそれが良くなるリサイズ後http://screencast.com/t/COmqye7dlwzA

あなたが見ることができるように直面した問題の詳細を提供することができ、ビデオが、それでもそれはパネル「panel_3」

の左上CONERでいくつかの奇妙な要素を持っています================================

#!/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() 

そして、ここではwxGladeによって生成されたコードです

更新

は、だから私は出て見つけたもの:

  1. ウィジェット検査ツールはpanel_3が親としてpanel_2していることを示しました。私はそれが正しいと思う。

  2. __do_layoutメソッドで 'self.Layout()'の直前に 'sizer_1.Layout()'を置くと、すべてが修正されます。そして、パネルの左上には奇妙なことはありません_3。私はそれが最初のTextControlに残っている印だと思う。

  3. もう1つ興味深いのは、私が 'self.Layout()'を取り除くことができるということです。

  4. また、__do_layoutメソッド 'self.panel_2.Fit()'または 'self.panel_2.Layout()'の最後に入れてみました。どちらの場合もアプリケーションはまだよく見ていました

私はFit()について読んだことがあり、それはLayout()と同様のthigをしていることが分かりました。私が間違っている ?そしてそれらの違いは何ですか?どの方法が良いですか?そして、なぜアプリケーションを正しく見せるためにフレームのトップエレメントをレイアウトする必要があり、Frame.Layout()はその仕事をしませんか?

答えて

1

Windows 7、wxPython 2.9.3.1、Python 2.6.6でこの問題を再現することはできません。ただし、フレームのサイズを変更してすべてをポップアップさせることができる問題がある場合は、通常、Layout()コールをどこかに配置する必要があります。通常は、表示する直前にフレームまたはトップサイザーのLayout()コマンドを呼び出すだけです。

あなたは既にそれを持っているようです。 panel_3の不思議なウィジェットは、何かが間違った親を持っているように見えますが、私がそれを実行したときにその問題が表示されないので、私はそれを診断できません。幸いなことに、ウィジェットのインスペクションツールを使用して、レイアウトの問題や他の多くのことを把握することができます。ここにリンクがあります:http://wiki.wxpython.org/Widget%20Inspection%20Tool

あなたはどのウィジェットがその親であるかを知るためにそれを使用することができます。これは、それを修正するために必要な情報を提供します。

UPDATE:

レイアウトは基本的には、ウィジェットが自分自身をレイアウトします。それは一種の力をリフレッシュします。フィットすると、最小のスペースを占めるようになります。この場合、フレームのレイアウトがあなたのマシンで動作しない理由はわかりません。私が言及したように、それは私のためにうまく動作します。 wxPythonメーリングリストに問い合わせて、wx開発者がいるところで完全な答えを得てください。

+0

私はPython2.7( '2.7(r27:82525、2010年7月4日、07:43:08)[MSC v.1500 64ビット(AMD64)]')とwxPython 2.8.12.1を使用しています。ちょっと後に私はアドバイスしたものを試してみるでしょう。結果を提供します... –

+0

私の質問に更新を入れました –

1

self.Layout()の直前でself.panel_2.Fit()に電話してみてください。また、ここでFedoraを使用し、wxPythonをLinux上で使用すると、明示的にFit()と呼ぶことなくレイアウトを誤って計算しているようです。

+0

ウィジェットを小さくしすぎたり、予測できない方法でレイアウトを邪魔したりしてフィットに問題がありました。私は通常、自分のプログラムでそれを避ける。幸運にも! –

関連する問題