1

私は3パネルのGUIを構築しようとしていますが、他のパネルの内側にパネル/ウィンドウをネストし、GUIの起動時にそれらを非表示にしようとするまで、すべてが順調に進んでいました。

この画像を参照してください...黄色/緑/青のボックスは、初期化中にパネルを埋めるために自動的に拡張されましたが、小さな紫色のボックスは構築されますが、wx.Panelの初期化中に、2秒のタイマーが切れるまで非表示になります。そのオブジェクトのShow()メソッドが呼び出されます。その時、それは収容パネルをいっぱいにしません。初期化中にパネルを非表示にすると、パネルサイザーがデフォルトサイズの20x20を選択するようです。

サイザーテスト

コードは次のとおりです。

import wx
import  wx.lib.scrolledpanel as scrolled

class NavPanel(wx.Panel):
    """"""
    def __init__(self, parent, actionPanel):
        """Constructor"""
        wx.Panel.__init__(self, parent) #, size=(200,600))
        self.actionPanel = actionPanel
        self.SetBackgroundColour("Yellow")

class ActionPanel(wx.Panel):
    """"""
    def __init__(self, parent, target_item=None):
        """Constructor"""
        wx.Panel.__init__(self, parent)
        self.SetBackgroundColour("Green")

        self.sc = NestedScrolledActionPanel(self)

        sizer = wx.BoxSizer(wx.HORIZONTAL)
        sizer.Add(self.sc, 1, wx.EXPAND)
        self.SetSizer(sizer)

    def show_child(self):
        # Putting a sizer here doesn't work either...
        self.sc.Show()


class NestedScrolledActionPanel(wx.ScrolledWindow):
    """"""
    def __init__(self, parent, target_item=None):
        """Constructor"""
        wx.ScrolledWindow.__init__(self, parent)
        self.SetBackgroundColour("Purple")

        # I don't want to show this at starutp, but hiding it causes the sizer to startup at 20x20!
        # Comment out this line and the sizer set in ActionPanel works, but you see it at startup
        self.Hide()       

class ConsolePanel(scrolled.ScrolledPanel): 
    """"""
    def __init__(self, parent):
        """Constructor"""

        scrolled.ScrolledPanel.__init__(self, parent, -1)
        self.SetBackgroundColour("Blue")

class MainPanel(wx.Panel):
    """"""
    def __init__(self, parent):
        """Constructor"""
        wx.Panel.__init__(self, parent)

        mainSplitter = wx.SplitterWindow(self)
        topSplitter = wx.SplitterWindow(mainSplitter)

        self.rightPanel = ActionPanel(topSplitter)
        self.rightPanel.SetBackgroundColour("Green")

        leftPanel = NavPanel(topSplitter, self.rightPanel)
        leftPanel.SetBackgroundColour("Yellow")

        topSplitter.SplitVertically(leftPanel, self.rightPanel, sashPosition=0)
        topSplitter.SetMinimumPaneSize(200)

        bottomPanel = ConsolePanel(mainSplitter)

        mainSplitter.SplitHorizontally(topSplitter, bottomPanel, sashPosition=400)
        mainSplitter.SetSashGravity(1)

        sizer = wx.BoxSizer(wx.HORIZONTAL)
        sizer.Add(mainSplitter, 1, wx.EXPAND)
        self.SetSizer(sizer)

        return


########################################################################
class MainFrame(wx.Frame):
    """"""
    def __init__(self):
        """Constructor"""

        wx.Frame.__init__(self, None, title="Sizer Test",
                          size=(800,600))

        self.panel = MainPanel(self)

        self.Centre()
        self.Show()

        self.timer = wx.Timer(self)
        self.Bind(wx.EVT_TIMER, self.OnTimer, self.timer)
        self.timer.Start(2000)

    def OnTimer(self, e):
        self.panel.rightPanel.show_child()

if __name__ == '__main__':
    app = wx.App(redirect=False)
    print "Launching frame"
    frame = MainFrame()
    print "starting mainloop"
    app.MainLoop()

GUIの起動時にこのパネルを非表示にする理由は、そのActionPanelスペース(緑色のボックス)にさまざまなパネルがあり、ユーザーが黄色のボックスのツリーノードをクリックすると、に表示されるパネルが表示されるためです。緑のボックスが非表示になり、別のパネルが表示されます。起動時にすべてのパネルを非表示にしないと、パネルは互いに「スタック」され、GUIの起動後のある時点で、通過してすべてを非表示にするタイマーを設定する必要があります。それはおかしなようです。他にどのように私はそれを行うことができますか?

4

2 に答える 2

1

self.Layout()show_childメソッドに追加します。子を表示するだけでは、サイズイベントのようにレイアウトはトリガーされません。サイズイベントなしでレイアウトを変更する必要がある場合は、自分でレイアウトを呼び出す必要があります。

于 2013-02-04T19:55:35.610 に答える
0

Stack Overflowの簡単なケースを作成するために多くの問題を経験しましたが、RobinDunnが答えた2番目の問題しか明らかになりませんでした。私の他のもっと厄介な問題は、オブジェクトに2つのサイザーを追加しようとしていたことでした。最後の1つだけがサイザーを取得し、残りは20x20で、私はそれを理解できませんでした。

2つの異なるパネルが異なる時間に同じ親パネルを共有するようにしたかったので、これを実行していました...(テストされていないコード)。

some_object= wx.Panel(self)  # Could be anything
sizer = BoxSizer(wx.VERTICAL)
sizer.Add(some_object, 1, wx.EXPAND)
sizer.SetSizer(sizer)

something_else = wx.Panel(self)  # Could be anything
something_else.Hide()
sizer = BoxSizer(wx.VERTICAL)
sizer.Add(something_else, 1, wx.EXPAND)
sizer.SetSizer(sizer)

しかし、私がすべきだったのはこれです:

some_object= wx.Panel(self)  # Could be anything
something_else = wx.Panel(self)  # Could be anything
something_else.Hide()
sizer = BoxSizer(wx.VERTICAL)
sizer.Add(some_object, 1, wx.EXPAND)
sizer.Add(something_else, 1, wx.EXPAND)
sizer.SetSizer(sizer)

そしてもちろん、さまざまなパネルを表示/非表示にするたびにLayout()を実行し、36時間後にヘッドバッシングを行うと、治癒します。

于 2013-02-06T06:51:43.127 に答える