0

特定の要素 (ここでは A、B、D、および G で表されます) をそれぞれ独自のデザインの「コーナー」に配置したいスペースがあります。角は、あたかも 4 つの要素のそれぞれが互いに反発し合っているかのように整列する必要があります。長方形。これは、サイズ変更できないパネル内に含まれます。似たようなパネルをいくつか用意し、要素の位置をできるだけ同じに保ちたいと考えています。(wx.Wizard よりも少し複雑なものが必要でしたが、基本的な考え方は同じです。)

AAAAAAAAAA      BB


CCCCCCCCCCCCCCCCCC
CCCCCCCCCCCCCCCCCC
CCCCCCCCCCCCCCCC
CCCCCCCCCCCCCC
CCCCCCCCCCCCCCCCCC
CCCCCCCCCCCCCCCC
CCCCCCCCCCCCCCCCCC


DDD EEE FFF    GGG

A は大きなフォントのテキストを表します。

B は、小さなフォントで数字の進行状況メーター (「1 of 7」など) を表します。

C は、大きなテキスト ブロックを表します。

D、E、F、および G はボタンです。

G ボタンは、機能のために他のボタンから分離されています。

私は入れ子wx.BoxSizers(1 つの垂直ボックス内の水平ボックス) を試みましたが、うまくいきませんでした。私の最初の問題wx.BoxSizerは、.SetMinSize私の最後の行が尊重されていないことです。2 番目の問題は、G ボタンをコミカルに大きくせずに「スペースを取る」方法や、右端と下端に押し付ける方法がわからないことです。

を使用しようとしましたwx.GridBagSizerが、まったく別の問題に遭遇しました。

さまざまなオンライン チュートリアルとwxPython in Actionを熟読した後、私は少しイライラしています。関連するフォーラムでは、2 週間に 1 回活動が見られるようです。「それで遊んで」私はどこにも行きませんでした。敷き詰められていないカーペットのこぶを平らにしようとしているような気がします。

4

3 に答える 3

4

BoxSizers と wx.EXPAND や wx.ALIGN_RIGHT などのフラグを使用すると、必要なものを取得できます。これが例です

import wx
import string
AF = string.ascii_uppercase[:7]

class MyFrame(wx.Frame):

    def __init__(self):
        wx.Frame.__init__(self, None, size=(300,300))

        a, b, c, d, e, f, g = [wx.Button(self, -1, 4*c) for c in AF]
        a.SetMaxSize((200,100))   # 'a' won't get bigger than 200 wide

        # build the top row (with sizers I usually work from inside to out)
        hs0 = wx.BoxSizer(wx.HORIZONTAL)
        hs0.Add(a, 1, wx.ALIGN_LEFT)  # 1 here means expand with weight 1
        hs0.Add((0,0), 1)  # also expand the spacing
        hs0.Add(b, 0, wx.ALIGN_RIGHT)  # 0 means don't expand this

        # build the bottom row
        hs1 = wx.BoxSizer(wx.HORIZONTAL)
        hs1.Add(d, 0, wx.ALIGN_LEFT)
        hs1.Add((10,10), 0)
        hs1.Add(e, 0)
        hs1.Add((10,10), 0)
        hs1.Add(f, 0)
        hs1.Add((10, 10), 1)
        hs1.Add(g, 0, wx.ALIGN_RIGHT)

        # stack the rows vertically
        vs = wx.BoxSizer(wx.VERTICAL)
        vs.Add(hs0, flag=wx.EXPAND)   # expand in the orthogonal direction to sizer (here horizontal)
        vs.Add(c, 1, flag=wx.EXPAND)  
        vs.Add(hs1, flag=wx.EXPAND)
        self.SetSizer(vs)

app = wx.PySimpleApp()
frame = MyFrame()
frame.Show(1)
app.MainLoop()

代替テキスト

于 2010-03-31T01:08:32.807 に答える
1

まず、ウィンドウを3行に分割するための垂直サイザーが必要です:AB、C、およびDEFG:

frame_sizer = wx.BoxSizer(wx.VERTICAL)

次に、最初の行に水平サイザーが必要です。

first_sizer = wx.BoxSizer(wx.HORIZONTAL)
# add the items A and B to first_sizer
# now we add first_sizer to frame_sizer
frame_sizer.Add(first_sizer)

次に、2行目では、Cコントロールをサイザーに追加します。

frame_sizer.Add(C)

...次のことを確認してください:

  • コントロールは、指定されたサイズで作成されます(コンストラクターを介して)
  • コントロールには最小サイズが与えられます(C.SetMinSize()

さて、最後の行では、おそらくあなたの最善の策は別の水平サイザーを使用することです。

wx.BoxSizer(wx.HORIZONTAL)
# add DEF
# now add some space between them
wx.AddSizer(10)
# now add G

うまくいけば、これはあなたのために働きます。そうでない場合、最善の策は、Code :: BlocksでwxSmithのようなGUIデザイナーを使用することです(これはC ++用に設計されていますが、少なくとも物事がどのように見えるかを理解するために使用できます-wxPythonは1対-1 wxWidgetsへの対応)

于 2010-03-30T18:15:04.257 に答える
0

フレームは1つしかありません。フレームにはいくつかのパネルが組み込まれています。それらはすべて隠されていますが、1つです。「次へ」ボタンは、そのパネルで .Hide() を実行し、.ShowYourself という関数を呼び出します。前の質問でわかるように、ウィザードのようなものが欲しかった

パネルにサイザーを取り付けようとしています。写真 http://tinypic.com/r/14nh651/5からわかるように、サイザーがパネル全体を占めるようにすることはできません。画像はプレビューに表示されていないため、http://tinypic.com/r/14nh651/5にあります。

import wx
import sys

class MyApp(
    wx.App      # This makes a subclass of the wx.App class

):

def OnInit(self):
    # image = wx.Image('wxPython.jpg', wx.BITMAP_TYPE_JPEG)
    self.frame = MyFrame(None)
    self.frame.Show()
    self.SetTopWindow(self.frame)
    return True

def OnExit(self):
    print 'Dying ...'

####################################################################################################

class MyFrame(
    wx.Frame    # This makes a subclass of the wx.Frame class
    ):
    """Frame class that displays an image."""

    def __init__(self, 
        image, 
        parent=None,                # "None" as a parameter means this is a top-level window
        id=-1,                  # "-1" means automatically generate a new ID
        title='Generic Title',          # What words appear in the title bar?
        pos=wx.DefaultPosition,         # Where is the upper left-hand corner?
        style=wx.CAPTION | wx.STAY_ON_TOP   # Style with only a caption
        ):      

    """Create a wx.Frame instance and display image."""

    size = (500, 500)
    wx.Frame.__init__(self, parent, id, 'Program Title', pos, size, style)

    sizer_h = wx.BoxSizer(wx.HORIZONTAL)

    self.panelX = TestLayout3(self)     
    sizer_h.Add(self.panelX)

    self.SetSizer(sizer_h)

    self.panelX.ShowYourself()

def ShutDown(self):

        self.Destroy()

####################################################################################################

class TestLayout3(wx.Panel):

# 0 - Splash screen with "Next" and "Cancel and Exit" buttons

def __init__(self, parent, id=-1):
    size = (600, 600)
    wx.Panel.__init__(self, parent, id, size)

    a, b, c, d, e, f, g = [wx.Button(self, -1, 4*c) for c in 'ABCDEFG']
    a.SetMaxSize((200,100))   # 'a' won't get bigger than 200 wide

    # build the top row (with sizers I usually work from inside to out)
    hs0 = wx.BoxSizer(wx.HORIZONTAL)
    hs0.Add(a, 1, wx.ALIGN_LEFT)  # 1 here means expand with weight 1
    hs0.Add((0,0), 1)  # also expand the spacing
    hs0.Add(b, 0, wx.ALIGN_RIGHT)  # 0 means don't expand this

    # build the bottom row
    hs2 = wx.BoxSizer(wx.HORIZONTAL)
    hs2.Add(d, 0, wx.ALIGN_LEFT)
    hs2.Add((10,10), 0)
    hs2.Add(e, 0)
    hs2.Add((10,10), 0)
    hs2.Add(f, 0)
    hs2.Add((10, 10), 1)
    hs2.Add(g, 0, wx.ALIGN_RIGHT)

    # stack the rows vertically
    vs = wx.BoxSizer(wx.VERTICAL)
    vs.Add(hs0, flag=wx.EXPAND)   # expand in the orthogonal direction to sizer (here horizontal)
    vs.Add(c, 1, flag=wx.EXPAND)  
    vs.Add(hs2, flag=wx.EXPAND)
    self.SetSizer(vs)

    self.Raise()
    self.SetPosition((0,0))
    self.Fit()  
    self.Hide()


# reveal this panel
def ShowYourself(self):
    self.Raise()
    self.SetPosition((0,0))
    self.Fit()
    self.Show()


# what do we do when the "Back" button is clicked?
def OnBack(self, event):
    self.Hide()
    self.GetParent().panel1.ShowYourself()

# what do we do when the "Next" button is clicked?
def OnNext(self, event):
    self.Hide()
    self.GetParent().panel1.ShowYourself()

    ![# what do we do when the "Cancel and Exit" button is clicked?
    def OnCancelAndExit(self, event):
        self.GetParent().ShutDown()

####################################################################################################

def main():
    app = MyApp(redirect = False)
    app.MainLoop()

####################################################################################################

if __name__ == '__main__':
    main()][3]
于 2010-03-31T15:57:50.603 に答える