URN Logo
UNIX Resources » Linux » China Linux Forum » Python 编 程 » 6 » 请教:Boa 的 Sizer 不好用,怎么办?
announcement 声明: 本页内容为中国Linux论坛的内容镜像,文章的版权以及其他所有的相关权利属于中国Linux论坛和相应文章的作者,如果转载,请注明文章来源及相关版权信息。
Resources
China Linux Forum(finished)
Linux Forum(finished)
FreeBSD China(finished)
linuxforum.net
  业界新闻与评论
  自由软件杂谈
  IT 人生
  Linux软件快递
  翻译作坊
  Linux图书与评论
  GNU Emacs/XEmacs
  Linux 中文环境和中文化
  Linux桌面与办公软件
  Linux 多媒体与娱乐版
  自由之窗Mozilla
  笔记本电脑上的Linux
  Gentoo
  Debian 一族
  网络管理技术
  Linux 安装与入门
  WEB服务器和FTP服务器
  域名服务器和邮件服务器
  Linux防火墙和代理服务器应用
  文件及打印服务器
  技术培训与认证
  Linux内核技术
  Linux 嵌入技术
  Linux设备驱动程序
  Linux 集群技术
  LINUX平台数据库
  系统和网络安全
  CPU 与 编译器
  系统计算研究所专栏
  Linux下的GUI软件开发
  C/C++编程版
  PHP 技 术
  Java&jsp技术
  Shell编程技术
  Perl 编 程
  Python 编 程
  XML/Web Service 技术
  永远的Unix
  FreeBSD世界
   
请教:Boa 的 Sizer 不好用,怎么办?
请教:Boa 的 Sizer 不好用,怎么办? - lawme [2005-10-12 07:33 | 209 byte(s)]
 
Re: 请教:Boa 的 Sizer 不好用,怎么办? - lawme [2005-10-13 03:49 | 42,517 byte(s)]
 
 
 
 
 
Subject: 请教:Boa 的 Sizer 不好用,怎么办?
Author: lawme    Posted: 2005-10-12 07:33    Length: 209 byte(s)
[Original] [Print] [Top]
跟着 Boa 的 tutorial 走了一遍,不灵。讲到调整几个 Sizer 的位置关系时,它一笔带过,只好自己瞎试,忙活半天也没整明白。

感觉不如 Swing 的 Layout 好用。

谁能指点一下,先谢了。
[Original] [Print] [Top]
Subject: Re: 请教:Boa 的 Sizer 不好用,怎么办?
Author: lawme    Posted: 2005-10-13 03:49    Length: 42,517 byte(s)
[Original] [Print] [Top]
看来,这种低档问题不会有人有兴趣帮忙。

刚才到wxPython网站找了个例程,贴在这里,与低手共享。

# Name: LearnSizers1.py
# Purpose: A demo app to learn sizers
# Author: Jean-Michel Fauth, Switzerland
# Copyright: (c) 2005 Jean-Michel Fauth
# Licence: GPL

# os dev: windows 98
# py dev: Python 2.4.1
# wx dev: wxPython 2.6.1
# Revision: 27 June 2005

# Contributor and minor fixes: Marcelo Barbero, Argentina
# Revision: 03 August 2005

# LearnSizer*.py is a small application aimed to learn the sizers and
# their usage.
# This application is a collection of panels. Each panel contains
# a few widgets laid out with sizers. The panels are numbered
# MyPanel_0 to MyPanel_n. The panel 0 is the simpliest case. The
# order of the panels follows an increasing complexity in the
# layout. It is warmly recommended to start with MyPanel_0.
#
# Do not forget:
# - the wxPython doc
# - the wiki page http://wiki.wxpython.org/index.cgi/UsingSizers
# - dir(<instance of a sizer>) for a list of methods
# - print sizer.method.__doc__
#


import os
import sys
import wx

class ColWin(wx.Window):
"""- A wx.Window with a coloured background
- pos and size == (-1, -1) since sizers are used"""

def __init__(self, parent, id, BackColour):
wx.Window.__init__(self, parent, id, (-1, -1), (-1, -1), wx.SIMPLE_BORDER)
self.SetBackgroundColour(BackColour)


class MyPanel_0(wx.Panel):
"""- The simpliest sizer, a ColWin
- use of named arguments"""

def __init__(self, parent):
wx.Panel.__init__(self, parent, -1, wx.DefaultPosition, wx.DefaultSize)

wgreen = ColWin(self, wx.NewId(), wx.GREEN)

b = 20
vsizer1 = wx.BoxSizer(orient=wx.VERTICAL)
# or
# vsizer1 = wx.BoxSizer(orient=wx.HORIZONTAL)
vsizer1.Add(item=wgreen, proportion=1, flag=wx.EXPAND | wx.ALL, border=b)
self.SetSizer(vsizer1)


class MyPanel_1(wx.Panel):
"""- Two ColWins, vertically"""

def __init__(self, parent):
wx.Panel.__init__(self, parent, -1, wx.DefaultPosition, wx.DefaultSize)

wred = ColWin(self, wx.NewId(), wx.RED)
wblue = ColWin(self, wx.NewId(), wx.BLUE)

b = 5
vsizer1 = wx.BoxSizer(wx.VERTICAL)
vsizer1.Add(wred, 1, wx.EXPAND | wx.ALL, b)
vsizer1.Add(wblue, 1, wx.EXPAND | wx.ALL, b)
self.SetSizer(vsizer1)


class MyPanel_2(wx.Panel):
"""- Three ColWins, horizontally """

def __init__(self, parent):
wx.Panel.__init__(self, parent, -1, wx.DefaultPosition, wx.DefaultSize)

wred = ColWin(self, wx.NewId(), wx.RED)
wblue = ColWin(self, wx.NewId(), wx.BLUE)
wgreen = ColWin(self, wx.NewId(), wx.GREEN)

b = 5
hsizer1 = wx.BoxSizer(wx.HORIZONTAL)
hsizer1.Add(wred, 1, wx.EXPAND | wx.ALL, b)
hsizer1.Add(wblue, 1, wx.EXPAND | wx.ALL, b)
hsizer1.Add(wgreen, 1, wx.EXPAND | wx.ALL, b)
self.SetSizer(hsizer1)


class MyPanel_3(wx.Panel):
"""- Three ColWins, horizontally, height ratio 1:2:3"""

def __init__(self, parent):
wx.Panel.__init__(self, parent, -1, wx.DefaultPosition, wx.DefaultSize)

wred = ColWin(self, wx.NewId(), wx.RED)
wblue = ColWin(self, wx.NewId(), wx.BLUE)
wgreen = ColWin(self, wx.NewId(), wx.GREEN)

b = 5
hsizer1 = wx.BoxSizer(wx.HORIZONTAL)
hsizer1.Add(wred, 1, wx.EXPAND | wx.ALL, b)
hsizer1.Add(wblue, 2, wx.EXPAND | wx.ALL, b)
hsizer1.Add(wgreen, 3, wx.EXPAND | wx.ALL, b)
self.SetSizer(hsizer1)


class MyPanel_4(wx.Panel):
"""- Two ColWins, vertically, a fixed width of 50 pixels between
the two items"""

def __init__(self, parent):
wx.Panel.__init__(self, parent, -1, wx.DefaultPosition, wx.DefaultSize)

wred = ColWin(self, wx.NewId(), wx.RED)
wblue = ColWin(self, wx.NewId(), wx.BLUE)

b = 5
vsizer1 = wx.BoxSizer(wx.VERTICAL)
vsizer1.Add(wred, 1, wx.EXPAND | wx.ALL, b)
vsizer1.Add((-1, 50), 0, wx.ALL, b)
vsizer1.Add(wblue, 1, wx.EXPAND | wx.ALL, b)
self.SetSizer(vsizer1)


class MyPanel_5(wx.Panel):
"""- Two items: a ColWin and a Button, vertically
- the Button is either left/right aligned or centered
- comment / uncomment for testing the Button alignment
- wx.ALIGN_LEFT is the default value"""

def __init__(self, parent):
wx.Panel.__init__(self, parent, -1, wx.DefaultPosition, wx.DefaultSize)

wred = ColWin(self, wx.NewId(), wx.RED)
b1 = wx.Button(self, wx.NewId(), 'button1', (-1, -1), wx.DefaultSize)

b = 5
vsizer1 = wx.BoxSizer(wx.VERTICAL)
vsizer1.Add(wred, 1, wx.EXPAND | wx.ALL, b)

#~ vsizer1.Add(b1, 0, wx.ALIGN_LEFT | wx.ALL, b)
#~ vsizer1.Add(b1, 0, wx.ALIGN_RIGHT | wx.ALL, b)
vsizer1.Add(b1, 0, wx.ALIGN_CENTER | wx.ALL, b)
self.SetSizer(vsizer1)


class MyPanel_6(wx.Panel):
"""- Three items: a ColWin and two Buttons
- the Buttons are either left/right aligned or centered"""

def __init__(self, parent):
wx.Panel.__init__(self, parent, -1, wx.DefaultPosition, wx.DefaultSize)

wred = ColWin(self, wx.NewId(), wx.RED)
b1 = wx.Button(self, wx.NewId(), '&OK', (-1, -1), wx.DefaultSize)
b2 = wx.Button(self, wx.NewId(), '&Cancel', (-1, -1), wx.DefaultSize)

b = 10
hsizer1 = wx.BoxSizer(wx.HORIZONTAL)
hsizer1.Add(b1, 0)
hsizer1.Add(b2, 0, wx.LEFT, b)

b = 5
vsizer1 = wx.BoxSizer(wx.VERTICAL)
vsizer1.Add(wred, 1, wx.EXPAND | wx.ALL, b)
vsizer1.Add(hsizer1, 0, wx.ALIGN_RIGHT | wx.ALL, b)
#~ vsizer1.Add(hsizer1, 0, wx.ALIGN_CENTER | wx.ALL, b)
#~ vsizer1.Add(hsizer1, 0, wx.ALIGN_LEFT | wx.ALL, b)
self.SetSizer(vsizer1)


class MyPanel_7(wx.Panel):
"""- Four items: a ColWin, two Buttons, and a StaticLine
- the Buttons are either left/right aligned or centered
- the height of the static line == 2, the wx.GROW flag specifies an
horizontal expansion, since the StaticLine is in a vertical sizer"""

def __init__(self, parent):
wx.Panel.__init__(self, parent, -1, wx.DefaultPosition, wx.DefaultSize)

wred = ColWin(self, wx.NewId(), wx.RED)
b1 = wx.Button(self, wx.NewId(), '&OK', (-1, -1), wx.DefaultSize)
b2 = wx.Button(self, wx.NewId(), '&Cancel', (-1, -1), wx.DefaultSize)
staline = wx.StaticLine(self, wx.NewId(), (-1, -1), (-1, 2), wx.LI_HORIZONTAL)

b = 5
hsizer1 = wx.BoxSizer(wx.HORIZONTAL)
hsizer1.Add(b1, 0)
hsizer1.Add(b2, 0, wx.LEFT, b)

vsizer1 = wx.BoxSizer(wx.VERTICAL)
vsizer1.Add(wred, 1, wx.EXPAND | wx.ALL, b)
vsizer1.Add(staline, 0, wx.GROW | wx.ALL, b)
vsizer1.Add(hsizer1, 0, wx.ALIGN_RIGHT | wx.ALL, b)
self.SetSizer(vsizer1)


class MyPanel_8(wx.Panel):
"""- 7 items: 2 ColWins and 5 Buttons
- ColWins: one is sizable, the other not
- Buttons at the right of the frame
- something like a toolbar at the right"""

def __init__(self, parent):
wx.Panel.__init__(self, parent, -1, wx.DefaultPosition, wx.DefaultSize)

wred = ColWin(self, wx.NewId(), wx.RED)
wwhite = ColWin(self, wx.NewId(), wx.WHITE)

b1 = wx.Button(self, wx.NewId(), '1', (-1, -1), wx.DefaultSize)
b2 = wx.Button(self, wx.NewId(), '2', (-1, -1), wx.DefaultSize)
b3 = wx.Button(self, wx.NewId(), '3', (-1, -1), wx.DefaultSize)
b4 = wx.Button(self, wx.NewId(), '4', (-1, -1), wx.DefaultSize)
b5 = wx.Button(self, wx.NewId(), '5', (-1, -1), wx.DefaultSize)

vsizer1 = wx.BoxSizer(wx.VERTICAL)
b = 3
vsizer1.Add(wred, 1, wx.EXPAND | wx.BOTTOM, b)
vsizer1.Add(wwhite, 0, wx.EXPAND, b)

vsizer2 = wx.BoxSizer(wx.VERTICAL)
b = 5
vsizer2.Add(b1, 0, wx.BOTTOM, b)
vsizer2.Add(b2, 0, wx.BOTTOM, b)
vsizer2.Add(b3, 0, wx.BOTTOM, b)
vsizer2.Add(b4, 0, wx.BOTTOM, b)
vsizer2.Add(b5, 0, wx.BOTTOM, b)

hsizer1 = wx.BoxSizer(wx.HORIZONTAL)
b = 10
hsizer1.Add(vsizer1, 1, wx.EXPAND | wx.LEFT | wx.TOP | wx.BOTTOM, b)
hsizer1.Add(vsizer2, 0, wx.EXPAND| wx.ALL, b)

self.SetSizer(hsizer1)


class MyPanel_9(wx.Panel):
"""- 7 items: 2 ColWins and 5 Buttons
- the ColWins are sizable
- the Buttons have a fixed height and a default width
- something like a toolbar at the top"""

def __init__(self, parent):
wx.Panel.__init__(self, parent, -1, wx.DefaultPosition, wx.DefaultSize)

wred = ColWin(self, wx.NewId(), wx.RED)
wwhite = ColWin(self, wx.NewId(), wx.WHITE)

h = 40
b1 = wx.Button(self, wx.NewId(), '1', (-1, -1), (-1, h))
b2 = wx.Button(self, wx.NewId(), '2', (-1, -1), (-1, h))
b3 = wx.Button(self, wx.NewId(), '3', (-1, -1), (-1, h))
b4 = wx.Button(self, wx.NewId(), '4', (-1, -1), (-1, h))
b5 = wx.Button(self, wx.NewId(), '5', (-1, -1), (-1, h))

hsizer1 = wx.BoxSizer(wx.HORIZONTAL)
hsizer1.Add(b1, 0)
hsizer1.Add(b2, 0)
hsizer1.Add(b3, 0)
hsizer1.Add(b4, 0)
hsizer1.Add(b5, 0)

b = 2
hsizer2 = wx.BoxSizer(wx.HORIZONTAL)
hsizer2.Add(wred, 1, wx.EXPAND | wx.RIGHT, b)
hsizer2.Add(wwhite, 1, wx.EXPAND | wx.LEFT, b)

b = 5
vsizer1 = wx.BoxSizer(wx.VERTICAL)
vsizer1.Add(hsizer1, 0, wx.EXPAND, b)
vsizer1.Add(hsizer2, 1, wx.ALL | wx.EXPAND, b)

self.SetSizer(vsizer1)


class MyPanel_10(wx.Panel):
"""- Three ColWins in a StaticBoxSizer, vertically"""

def __init__(self, parent):
wx.Panel.__init__(self, parent, -1, wx.DefaultPosition, wx.DefaultSize)

wred = ColWin(self, wx.NewId(), wx.RED)
wblue = ColWin(self, wx.NewId(), wx.BLUE)
wgreen = ColWin(self, wx.NewId(), wx.GREEN)

b = 10 #inside the staticbox
vsbsizer1 = wx.StaticBoxSizer(wx.StaticBox(self, wx.NewId(), 'StaticboxSizer with a caption'), wx.VERTICAL)
vsbsizer1.Add(wred, 1, wx.EXPAND | wx.ALL, b)
vsbsizer1.Add(wblue, 1, wx.EXPAND | wx.ALL, b)
vsbsizer1.Add(wgreen, 1, wx.EXPAND | wx.ALL, b)
self.SetSizer(vsbsizer1)


class MyPanel_11(wx.Panel):
"""- Three ColWins in a StaticBoxSizer, vertically
- the StaticBoxSizer is in a sizer to enable a border"""

def __init__(self, parent):
wx.Panel.__init__(self, parent, -1, wx.DefaultPosition, wx.DefaultSize)

wred = ColWin(self, wx.NewId(), wx.RED)
wblue = ColWin(self, wx.NewId(), wx.BLUE)
wgreen = ColWin(self, wx.NewId(), wx.GREEN)

b = 10 #inside the staticbox
vsbsizer1 = wx.StaticBoxSizer(wx.StaticBox(self, wx.NewId(), 'StaticboxSizer with a caption'), wx.VERTICAL)
vsbsizer1.Add(wred, 1, wx.EXPAND | wx.ALL, b)
vsbsizer1.Add(wblue, 1, wx.EXPAND | wx.ALL, b)
vsbsizer1.Add(wgreen, 1, wx.EXPAND | wx.ALL, b)

b = 20
hsizer1 = wx.BoxSizer(wx.HORIZONTAL)
hsizer1.Add(vsbsizer1, 1, wx.EXPAND | wx.ALL, b)

self.SetSizer(hsizer1)


class MyPanel_12(wx.Panel):
"""- 5 ColWins, vertically
- ColWins 2 and 4 are in StaticBoxSizer"""

def __init__(self, parent):
wx.Panel.__init__(self, parent, -1, wx.DefaultPosition, wx.DefaultSize)

wred = ColWin(self, wx.NewId(), wx.RED)
wblue = ColWin(self, wx.NewId(), wx.BLUE)
wgreen = ColWin(self, wx.NewId(), wx.GREEN)
wwhite = ColWin(self, wx.NewId(), wx.WHITE)
wyellow = ColWin(self, wx.NewId(), wx.NamedColour('yellow'))

b = 10
vsbsizer1 = wx.StaticBoxSizer(wx.StaticBox(self, wx.NewId(), 'blue'), wx.VERTICAL)
vsbsizer1.Add(wblue, 1, wx.EXPAND | wx.ALL, b)

vsbsizer2 = wx.StaticBoxSizer(wx.StaticBox(self, wx.NewId(), 'white'), wx.VERTICAL)
vsbsizer2.Add(wwhite, 1, wx.EXPAND | wx.ALL, b)

b = 5
vsizer1 = wx.BoxSizer(wx.VERTICAL)
vsizer1.Add(wred, 1, wx.EXPAND | wx.ALL, b)
vsizer1.Add(vsbsizer1, 1, wx.EXPAND | wx.ALL, b)
vsizer1.Add(wgreen, 1, wx.EXPAND | wx.ALL, b)
vsizer1.Add(vsbsizer2, 1, wx.EXPAND | wx.ALL, b)
vsizer1.Add(wyellow, 1, wx.EXPAND | wx.ALL, b)

self.SetSizer(vsizer1)


class MyPanel_13(wx.Panel):
"""- 3 StaticBoxSizers with a ColWin in each
- the StaticBoxSizers are arranged vertically"""

def __init__(self, parent):
wx.Panel.__init__(self, parent, -1, wx.DefaultPosition, wx.DefaultSize)

wred = ColWin(self, wx.NewId(), wx.NamedColour('red'))
wgreen = ColWin(self, wx.NewId(), wx.NamedColour('green'))
wblue = ColWin(self, wx.NewId(), wx.NamedColour('blue'))

b = 10
sizer1 = wx.StaticBoxSizer(wx.StaticBox(self, wx.NewId(), 'Staticbox'), wx.VERTICAL)
sizer1.Add(wred, 1, wx.EXPAND | wx.ALL, b)

sizer2 = wx.StaticBoxSizer(wx.StaticBox(self, wx.NewId(), 'Staticbox'), wx.VERTICAL)
sizer2.Add(wgreen, 1, wx.EXPAND | wx.ALL, b)

sizer4 = wx.StaticBoxSizer(wx.StaticBox(self, wx.NewId(), 'Staticbox'), wx.VERTICAL)
sizer4.Add(wblue, 1, wx.EXPAND | wx.ALL, b)

#tricky: the 2nd and 3rd staticbox sizer are shifted one pixel to the
#left, try with b2 = 0
b1, b2 = 0, -1
sizer3 = wx.BoxSizer(wx.HORIZONTAL)
sizer3.Add(sizer1, 1, wx.EXPAND, b1)
sizer3.Add(sizer2, 1, wx.EXPAND | wx.LEFT, b2)
sizer3.Add(sizer4, 1, wx.EXPAND | wx.LEFT, b2)

self.SetSizer(sizer3)


class MyPanel_14(wx.Panel):
"""- 3 ColWins, horizontally, 2 spacers with a fixed height"""

def __init__(self, parent):
wx.Panel.__init__(self, parent, -1, wx.DefaultPosition, wx.DefaultSize)

wred = ColWin(self, wx.NewId(), wx.RED)
wblue = ColWin(self, wx.NewId(), wx.BLUE)
wgreen = ColWin(self, wx.NewId(), wx.GREEN)

b = 0
h = 20
hsizer1 = wx.BoxSizer(wx.VERTICAL)
hsizer1.Add(wred, 1, wx.EXPAND | wx.ALL, b)
hsizer1.Add((-1, h))
hsizer1.Add(wblue, 1, wx.EXPAND | wx.ALL, b)
hsizer1.Add((-1, h))
hsizer1.Add(wgreen, 1, wx.EXPAND | wx.ALL, b)
self.SetSizer(hsizer1)


class MyPanel_15(wx.Panel):
"""- 4 items: a ColWin and 3 Buttons
- Buttons 1 and 3 are left/right aligned, Button 2 is centered
- use of spacers to set a gap between the Buttons.
- better way?"""

def __init__(self, parent):
wx.Panel.__init__(self, parent, -1, wx.DefaultPosition, wx.DefaultSize)

wgreen = ColWin(self, wx.NewId(), wx.NamedColour('green'))
b1 = wx.Button(self, wx.NewId(), 'button1', (-1, -1), wx.DefaultSize)
b2 = wx.Button(self, wx.NewId(), 'button2', (-1, -1), wx.DefaultSize)
b3 = wx.Button(self, wx.NewId(), 'button3', (-1, -1), wx.DefaultSize)

b = 0
hsizer1 = wx.BoxSizer(wx.HORIZONTAL)
hsizer1.Add(b1, 0, wx.ALL, b)
hsizer1.Add((-1, -1), 1)
hsizer1.Add(b2, 0, wx.ALL, b)
hsizer1.Add((-1, -1), 1)
hsizer1.Add(b3, 0, wx.ALL, b)

#tip: this does not work
#~ b = 0
#~ hsizer1 = wx.BoxSizer(wx.HORIZONTAL)
#~ hsizer1.Add(b1, 0, wx.ALIGN_LEFT, b)
#~ hsizer1.Add(b2, 0, wx.ALIGN_CENTER, b)
#~ hsizer1.Add(b3, 0, wx.ALIGN_RIGHT, b)

b = 5
vsizer2 = wx.BoxSizer(wx.VERTICAL)
vsizer2.Add(wgreen, 1, wx.EXPAND | wx.ALL, b)
vsizer2.Add(hsizer1, 0, wx.EXPAND | wx.ALL, b)
self.SetSizer(vsizer2)


class MyPanel_16(wx.Panel):
"""- 4 items: a ColWin, 3 Buttons
- Buttons 1 and 3 are top/bottom aligned, Button 2 is centered
- use of spacers to set a gap between the Buttons
- better way?"""

def __init__(self, parent):
wx.Panel.__init__(self, parent, -1, wx.DefaultPosition, wx.DefaultSize)

wgreen = ColWin(self, wx.NewId(), wx.NamedColour('green'))
b1 = wx.Button(self, wx.NewId(), 'button1', (-1, -1), wx.DefaultSize)
b2 = wx.Button(self, wx.NewId(), 'button2', (-1, -1), wx.DefaultSize)
b3 = wx.Button(self, wx.NewId(), 'button3', (-1, -1), wx.DefaultSize)

b = 0
vsizer1 = wx.BoxSizer(wx.VERTICAL)
vsizer1.Add(b1, 0, wx.ALL, b)
vsizer1.Add((-1, -1), 1)
vsizer1.Add(b2, 0, wx.ALL, b)
vsizer1.Add((-1, -1), 1)
vsizer1.Add(b3, 0, wx.ALL, b)

b = 5
hsizer2 = wx.BoxSizer(wx.HORIZONTAL)
hsizer2.Add(vsizer1, 0, wx.EXPAND | wx.ALL, b)
hsizer2.Add(wgreen, 1, wx.EXPAND | wx.ALL, b)
self.SetSizer(hsizer2)


class MyPanel_17(wx.Panel):
"""- An input box"""
def __init__(self, parent):
wx.Panel.__init__(self, parent, -1, wx.DefaultPosition, wx.DefaultSize)
self.parent = parent

s = 'abc' + os.linesep + 'def' + os.linesep + 'ghi'
statxt = wx.StaticText(self, -1, s, (-1, -1), (-1, -1))
txt = wx.TextCtrl(self, wx.NewId(), 'input', (-1, -1), (-1, -1))
staline = wx.StaticLine(self, -1, (-1, -1), (-1, -1), wx.LI_HORIZONTAL)

b1 = wx.Button(self, wx.NewId(), "&OK", (-1, -1), wx.DefaultSize)
b2 = wx.Button(self, wx.NewId(), "&Cancel", (-1, -1), wx.DefaultSize)

b = 10
hsizer1 = wx.BoxSizer(wx.HORIZONTAL)
hsizer1.Add(b1, 0)
hsizer1.Add(b2, 0, wx.LEFT, b)

b = 5
vsizer1 = wx.BoxSizer(wx.VERTICAL)
vsizer1.Add(statxt, 0, wx.GROW | wx.ALL, b)
vsizer1.Add(txt, 0, wx.GROW | wx.ALL, b)
vsizer1.Add(staline, 0, wx.GROW | wx.ALL, b)
vsizer1.Add(hsizer1, 0, wx.ALIGN_RIGHT | wx.ALL, b)
vsizer1.SetMinSize((300, -1))
self.SetSizerAndFit(vsizer1)

#the items are not sizable, once set, pass the fitted size to
#the parent
self.parent.SetClientSize(vsizer1.GetSize())


class MyPanel_18(wx.Panel):
"""- A message box"""

def __init__(self, parent):
wx.Panel.__init__(self, parent, -1, wx.DefaultPosition, wx.DefaultSize)
self.parent = parent

s = 'This is a rather long message with.'
s += (os.linesep + 'a lot of lines...')*20

statxt = wx.StaticText(self, -1, s, (-1, -1), (-1, -1))
staline = wx.StaticLine(self, -1, (-1, -1), (-1, -1), wx.LI_HORIZONTAL)
b1 = wx.Button(self, wx.NewId(), "&OK", (-1, -1), wx.DefaultSize)

b = 5
vsizer1 = wx.BoxSizer(wx.VERTICAL)
vsizer1.Add(statxt, 1, wx.EXPAND | wx.ALL, b)
vsizer1.Add(staline, 0, wx.GROW | wx.ALL, b)
vsizer1.Add(b1, 0, wx.ALIGN_CENTER | wx.ALL, b)
vsizer1.SetMinSize((200, -1))
self.SetSizerAndFit(vsizer1)

self.parent.SetClientSize(vsizer1.GetSize())


class MyPanel_19(wx.Panel):
"""- A serie of couples, StaticText-TextCtrl
- Buttons ok and cancel"""

def __init__(self, parent):
wx.Panel.__init__(self, parent, -1, wx.DefaultPosition, wx.DefaultSize)
self.parent = parent

lab1 = wx.StaticText(self, -1, 'hydrogen :', (-1, -1), (-1, -1), wx.ALIGN_RIGHT)
lab2 = wx.StaticText(self, -1, 'tin :', (-1, -1), (-1, -1), wx.ALIGN_RIGHT)
lab3 = wx.StaticText(self, -1, 'mendelevium :', (-1, -1), (-1, -1), wx.ALIGN_RIGHT)
lab4 = wx.StaticText(self, -1, 'carbon :', (-1, -1), (-1, -1), wx.ALIGN_RIGHT)
txt1 = wx.TextCtrl(self, -1, '', (-1, -1), (-1, -1))
txt2 = wx.TextCtrl(self, -1, '', (-1, -1), (-1, -1))
txt3 = wx.TextCtrl(self, -1, '', (-1, -1), (-1, -1))
txt4 = wx.TextCtrl(self, -1, '', (-1, -1), (-1, -1))
b1 = wx.Button(self, wx.NewId(), '&OK', (-1, -1), wx.DefaultSize)
b2 = wx.Button(self, wx.NewId(), '&Cancel', (-1, -1), wx.DefaultSize)
staline = wx.StaticLine(self, wx.NewId(), (-1, -1), (-1, 2), wx.LI_HORIZONTAL)

b = 5
w = 100
hsizer1 = wx.BoxSizer(wx.HORIZONTAL)
hsizer1.Add(lab1, 0, wx.RIGHT, b)
hsizer1.Add(txt1, 1, wx.GROW, b)
hsizer1.SetItemMinSize(lab1, (w, -1))

hsizer2 = wx.BoxSizer(wx.HORIZONTAL)
hsizer2.Add(lab2, 0, wx.RIGHT, b)
hsizer2.Add(txt2, 1, wx.GROW, b)
hsizer2.SetItemMinSize(lab2, (w, -1))

hsizer3 = wx.BoxSizer(wx.HORIZONTAL)
hsizer3.Add(lab3, 0, wx.RIGHT, b)
hsizer3.Add(txt3, 1, wx.GROW, b)
hsizer3.SetItemMinSize(lab3, (w, -1))

hsizer4 = wx.BoxSizer(wx.HORIZONTAL)
hsizer4.Add(lab4, 0, wx.RIGHT, b)
hsizer4.Add(txt4, 1, wx.GROW, b)
hsizer4.SetItemMinSize(lab4, (w, -1))

hsizer5 = wx.BoxSizer(wx.HORIZONTAL)
hsizer5.Add(b1, 0)
hsizer5.Add(b2, 0, wx.LEFT, 10)

b = 5
vsizer1 = wx.BoxSizer(wx.VERTICAL)
vsizer1.Add(hsizer1, 0, wx.EXPAND | wx.ALL, b)
vsizer1.Add(hsizer2, 0, wx.EXPAND | wx.ALL, b)
vsizer1.Add(hsizer3, 0, wx.EXPAND | wx.ALL, b)
vsizer1.Add(hsizer4, 0, wx.EXPAND | wx.ALL, b)
vsizer1.Add(staline, 0, wx.GROW | wx.ALL, b)
vsizer1.Add(hsizer5, 0, wx.ALIGN_RIGHT | wx.ALL, b)

self.SetSizerAndFit(vsizer1)
self.parent.SetClientSize(vsizer1.GetSize())


class MyPanel_20(wx.Panel):
"""- A FlexGridSizer
- 4 ColWins as cells, all sizeable"""

def __init__(self, parent):
wx.Panel.__init__(self, parent, -1, wx.DefaultPosition, wx.DefaultSize)

wred = ColWin(self, -1, wx.RED)
wblue = ColWin(self, -1, wx.BLUE)
wwhite = ColWin(self, -1, wx.WHITE)
wcyan = ColWin(self, -1, wx.CYAN)

hgap, vgap = 0, 0
nrows, ncols = 2, 2
fgs = wx.FlexGridSizer(nrows, ncols, hgap, vgap)

b = 5
fgs.AddMany([(wred, 1, wx.EXPAND | wx.ALL, b),
(wblue, 1, wx.EXPAND | wx.ALL, b),
(wwhite, 1, wx.EXPAND | wx.ALL, b),
(wcyan, 1, wx.EXPAND | wx.ALL, b),
])

# or
#~ fgs.Add(wred, 1, wx.EXPAND | wx.ALL, b)
#~ fgs.Add(wblue, 1, wx.EXPAND | wx.ALL, b)
#~ fgs.Add(wwhite, 1, wx.EXPAND | wx.ALL, b)
#~ fgs.Add(wcyan, 1, wx.EXPAND | wx.ALL, b)

#set all rows and cols sizable, try to comment / uncomment
fgs.AddGrowableRow(0)
fgs.AddGrowableRow(1)
fgs.AddGrowableCol(0)
fgs.AddGrowableCol(1)

self.SetSizer(fgs)


class MyPanel_21(wx.Panel):
"""- A FlexgridSizer with 4 cells
- cell (0, 0) is a column of 3 Buttons
- cell (1, 1) is a row of 3 Buttons
- cell (1, 0) is empty
- cell (0, 1) is a ColWin"""

def __init__(self, parent):
wx.Panel.__init__(self, parent, -1, wx.DefaultPosition, wx.DefaultSize)

wwhite = ColWin(self, -1, wx.WHITE)
b1 = wx.Button(self, -1, 'button1', (-1, -1), wx.DefaultSize)
b2 = wx.Button(self, -1, 'button2', (-1, -1), wx.DefaultSize)
b3 = wx.Button(self, -1, 'button3', (-1, -1), wx.DefaultSize)
b4 = wx.Button(self, -1, 'button4', (-1, -1), wx.DefaultSize)
b5 = wx.Button(self, -1, 'button5', (-1, -1), wx.DefaultSize)
b6 = wx.Button(self, -1, 'button6', (-1, -1), wx.DefaultSize)

b = 0
hsizer1 = wx.BoxSizer(wx.HORIZONTAL)
hsizer1.Add(b1, 0, wx.ALL, b)
hsizer1.Add((-1, -1), 1)
hsizer1.Add(b2, 0, wx.ALL, b)
hsizer1.Add((-1, -1), 1)
hsizer1.Add(b3, 0, wx.ALL, b)

b = 0
vsizer1 = wx.BoxSizer(wx.VERTICAL)
vsizer1.Add(b4, 0, wx.ALL, b)
vsizer1.Add((-1, -1), 1)
vsizer1.Add(b5, 0, wx.ALL, b)
vsizer1.Add((-1, -1), 1)
vsizer1.Add(b6, 0, wx.ALL, b)

hgap, vgap = 0, 0
nrows, ncols = 2, 2
fgs = wx.FlexGridSizer(nrows, ncols, hgap, vgap)

b = 5
fgs.AddMany([(vsizer1, 1, wx.EXPAND | wx.ALL, b),
(wwhite, 1, wx.EXPAND | wx.ALL, b),
((-1, -1), 1, wx.EXPAND | wx.ALL, b),
(hsizer1, 1, wx.EXPAND | wx.ALL, b),
])

#really tricky ;-)
fgs.AddGrowableRow(0)
fgs.AddGrowableCol(1)

self.SetSizer(fgs)


class MyPanel_22(wx.Panel):
"""- A FlexGridSizer of 9 cells (3x3) with 5 ColWins in cells
and 4 empty cells"""

def __init__(self, parent):
wx.Panel.__init__(self, parent, -1, wx.DefaultPosition, wx.DefaultSize)

wwhite = ColWin(self, -1, wx.WHITE)
wblue = ColWin(self, -1, wx.BLUE)
wgreen = ColWin(self, -1, wx.GREEN)
wcyan = ColWin(self, -1, wx.CYAN)
wred = ColWin(self, -1, wx.RED)

hgap, vgap = 0, 0
nrows, ncols = 3, 3
fgs = wx.FlexGridSizer(nrows, ncols, hgap, vgap)

b = 5
fgs.AddMany([(wwhite, 1, wx.EXPAND | wx.ALL, b),
((-1, -1), 1, wx.EXPAND | wx.ALL, b),
(wblue, 1, wx.EXPAND | wx.ALL, b),

((-1, -1), 1, wx.EXPAND | wx.ALL, b),
(wgreen, 1, wx.EXPAND | wx.ALL, b),
((-1, -1), 1, wx.EXPAND | wx.ALL, b),

(wred, 1, wx.EXPAND | wx.ALL, b),
((-1, -1), 1, wx.EXPAND | wx.ALL, b),
(wcyan, 1, wx.EXPAND | wx.ALL, b),
])

fgs.AddGrowableRow(0)
fgs.AddGrowableRow(1)
fgs.AddGrowableRow(2)

fgs.AddGrowableCol(0)
fgs.AddGrowableCol(1)
fgs.AddGrowableCol(2)

self.SetSizer(fgs)


class MyPanel_23(wx.Panel):
"""- A FlexGridSizer of 9 cells (3x3) with 4 ColWins in cells and 5 empty cells
- rows 1 and 3 have a fixed size"""

def __init__(self, parent):
wx.Panel.__init__(self, parent, -1, wx.DefaultPosition, wx.DefaultSize)

h = 40
wwhite = wx.Window(self, -1, (-1, -1), (-1, h), wx.SIMPLE_BORDER)
wwhite.SetBackgroundColour(wx.WHITE)
wblue = ColWin(self, -1, wx.BLUE)
wgreen = ColWin(self, -1, wx.GREEN)
wred = wx.Window(self, -1, (-1, -1), (-1, h), wx.SIMPLE_BORDER)
wred.SetBackgroundColour(wx.RED)

hgap, vgap = 0, 0
nrows, ncols = 3, 3
fgs = wx.FlexGridSizer(nrows, ncols, hgap, vgap)

b = 5
fgs.AddMany([((-1, -1), 1, wx.EXPAND | wx.ALL, b),
(wwhite, 1, wx.EXPAND | wx.ALL, b),
((-1, -1), 1, wx.EXPAND | wx.ALL, b),

(wblue, 1, wx.EXPAND | wx.ALL, b),
((-1, -1), 1, wx.EXPAND | wx.ALL, b),
(wgreen, 1, wx.EXPAND | wx.ALL, b),

((-1, -1), 1, wx.EXPAND | wx.ALL, b),
(wred, 1, wx.EXPAND | wx.ALL, b),
((-1, -1), 1, wx.EXPAND | wx.ALL, b),
])

fgs.AddGrowableRow(1)

fgs.AddGrowableCol(0)
fgs.AddGrowableCol(1)
fgs.AddGrowableCol(2)

self.SetSizer(fgs)


class MyPanel_24(wx.Panel):
"""- This example is coming from one of my applications
- in the real app, the white window is a drawing area and
the five lower windows are StaticTexts with a defined
font size (this is why I force a fixed height)"""

def __init__(self, parent):
wx.Panel.__init__(self, parent, -1, wx.DefaultPosition, wx.DefaultSize)
self.parent = parent

#a menu for the beauty of the demo
menu1 = wx.Menu()
menu1.Append(101, '&aaa')
menuBar = wx.MenuBar()
menuBar.Append(menu1, '&File')
self.parent.SetMenuBar(menuBar)

wwhite = ColWin(self, -1, wx.WHITE)
wblue = ColWin(self, -1, wx.BLUE)
wgreen = ColWin(self, -1, wx.GREEN)
wcyan = ColWin(self, -1, wx.CYAN)
wred = ColWin(self, -1, wx.RED)
wcoral = ColWin(self, -1, wx.NamedColour('coral'))
staline = wx.StaticLine(self, -1, (-1, -1), (-1, 2), wx.LI_HORIZONTAL)

vsizer1 = wx.BoxSizer(wx.VERTICAL)
b = 5
vsizer1.Add(wblue, 1, wx.EXPAND | wx.BOTTOM, b)
vsizer1.Add(wgreen, 1, wx.EXPAND)

hsizer2 = wx.BoxSizer(wx.HORIZONTAL)
b = 5
minhe = 100
hsizer2.Add(wcoral, 2, wx.EXPAND | wx.RIGHT, b)
hsizer2.Add(wcyan, 3, wx.EXPAND | wx.RIGHT, b)
hsizer2.Add(wred, 3, wx.EXPAND | wx.RIGHT, b)
hsizer2.Add(vsizer1, 2, wx.EXPAND, border=b)
hsizer2.SetItemMinSize(wcoral, (-1, minhe))
hsizer2.SetItemMinSize(wcyan, (-1, minhe))
hsizer2.SetItemMinSize(wred, (-1, minhe))
hsizer2.SetItemMinSize(vsizer1, (-1, minhe))

vsizer3 = wx.BoxSizer(wx.VERTICAL)
b = 5
vsizer3.Add(staline, 0, wx.GROW | wx.ALL, 0)
vsizer3.Add(wwhite, 1, wx.EXPAND | wx.TOP | wx.LEFT | wx.RIGHT, b)
vsizer3.Add(hsizer2, 0, wx.EXPAND | wx.ALL, b)

self.SetSizerAndFit(vsizer3)


class MyPanel_25(wx.Panel):
"""- This shows the relaton between the font size and the size of the
widgets when sizers are used"""

def __init__(self, parent):
wx.Panel.__init__(self, parent, -1, wx.DefaultPosition, wx.DefaultSize)
self.parent = parent

fs = 20
self.SetFont(wx.Font(fs, wx.DEFAULT, wx.NORMAL, wx.NORMAL, False))


statxt1 = wx.StaticText(self, -1, 'one, two, three', (-1, -1), (-1, -1))
statxt1.SetBackgroundColour(wx.WHITE)
statxt2 = wx.StaticText(self, -1, 'eins, zwei, drei', (-1, -1), (-1, -1))
statxt3 = wx.StaticText(self, -1, 'un, deux, trois', (-1, -1), (-1, -1))
b1 = wx.Button(self, wx.NewId(), 'button1', (-1, -1), (-1, -1))
b2 = wx.Button(self, wx.NewId(), 'button2', (-1, -1), (-1, -1))

b = 5
hsizer1 = wx.BoxSizer(wx.HORIZONTAL)
hsizer1.Add(b1, 1, wx.EXPAND | wx.ALL, b)
hsizer1.Add(b2, 1, wx.EXPAND | wx.ALL, b)

vsizer1 = wx.BoxSizer(wx.VERTICAL)
vsizer1.Add(statxt1, 0, wx.ALL, b)
vsizer1.Add(statxt2, 0, wx.ALL, b)
vsizer1.Add(statxt3, 0, wx.ALL, b)
vsizer1.Add(hsizer1, 0, wx.ALL, b)

self.SetSizerAndFit(vsizer1)
self.parent.SetClientSize(vsizer1.GetSize())


class TestComboBox(wx.Panel):
def __init__(self, parent, id):
wx.Panel.__init__(self, parent, id)

sampleList = []
for i in range(0, 26):
sampleList.append('MyPanel_' + `i`)

st = wx.StaticText(self, -1, "Select the example you want to see."
"Then click the View button.", (-1, -1))

doctxt = wx.StaticText(self, -1, "")
doctxt.SetLabel(MyPanel_0.__doc__)
self.doctxt = doctxt

# This combobox is created with a preset list of values.
cb = wx.ComboBox(
self, -1, "MyPanel_0", (-1, -1),
(-1, -1), sampleList, wx.CB_DROPDOWN
)
self.cb = cb

stline = wx.StaticLine(self, -1, (-1, -1), (-1, 2), wx.LI_HORIZONTAL)

btnView = wx.Button(self, -1, "&View")
self.Bind(wx.EVT_BUTTON, self.OnClickView, btnView)

btnExit = wx.Button(self, -1, "E&xit")
self.Bind(wx.EVT_BUTTON, self.OnClickExit, btnExit)

b = 5
vsizer1 = wx.BoxSizer(wx.VERTICAL)
vsizer1.Add(st, 0, wx.EXPAND | wx.ALL, b)
vsizer1.Add(cb, 0, wx.EXPAND | wx.ALL, 0)
vsizer1.Add(doctxt, 0, wx.EXPAND | wx.ALL, b)

hsizer1 = wx.BoxSizer(wx.HORIZONTAL)
hsizer1.Add(btnView, 0)
hsizer1.Add(btnExit, 0, wx.LEFT, b)

vsizer2 = wx.BoxSizer(wx.VERTICAL)
vsizer2.Add(vsizer1, 5, wx.EXPAND | wx.ALL, 0)
vsizer2.Add(stline, 0, wx.GROW | wx.ALL, b)
vsizer2.Add(hsizer1, 1, wx.ALIGN_RIGHT | wx.ALL, b)
self.SetSizer(vsizer2)

self.Bind(wx.EVT_COMBOBOX, self.EvtComboBox, cb)

# When the user selects something, we go here.
def EvtComboBox(self, evt):
self.doctxt.SetLabel(eval('%s.__doc__' % self.cb.GetValue()))

def OnClickView(self, evt):
win = wx.Frame(self, -1, self.cb.GetValue(), size=(350, 200),
style = wx.DEFAULT_FRAME_STYLE)
eval('%s(win)' % self.cb.GetValue())

win.CenterOnScreen()
win.Show(True)

def OnClickExit(self, evt):
sys.exit()



class MyFrame(wx.Frame):

def __init__(self, parent, id):
s = __file__
wx.Frame.__init__(self, parent, id, s, (0, 0), (500, 400))

self.panel = eval('MyPanel_%d(self)' % panel)
self.Bind(wx.EVT_CLOSE, self.OnCloseWindow)

def OnCloseWindow(self, event):
self.Destroy()


class MyApp(wx.App):

def OnInit(self):
frame = wx.Frame(None, -1, __file__, (0, 0), (400, 300))
frame.panel = TestComboBox(frame, -1)
frame.Show(True)
self.SetTopWindow(frame)
return True


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


if __name__ == "__main__" :
main()

[Original] [Print] [Top]
Subject: Re: 请教:Boa 的 Sizer 不好用,怎么办?
Author: lawme    Posted: 2005-10-14 23:50    Length: 250 byte(s)
[Original] [Print] [Top]

上面例程的 Layout 方式,只能手工硬写码,并且,与 Aob 的“半自动”生成的代码区别很大。

看来,Boa 0.4.4 在 Layout 所见即所得方面,无法实用。

一是控件的位置不能适当调整,二是有时在设置参数后, Boa 会崩溃。
[Original] [Print] [Top]
Subject: Re: 请教:Boa 的 Sizer 不好用,怎么办?
Author: lawme    Posted: 2005-10-15 06:37    Length: 218 byte(s)
[Original] [Print] [Top]
经过四天的痛苦折磨,终于大获全胜,问题彻底解决。

反思一下,怎么这么笨呢,如此简单的办法竟然想不到,要花费这么多功夫。

不过,不管怎样总是自个努力的结果,真高兴。

[Original] [Print] [Top]
Subject: Re: 请教:Boa 的 Sizer 不好用,怎么办?
Author: limodou    Posted: 2005-10-16 13:51    Length: 426 byte(s)
[Original] [Print] [Top]
这几天有事没有及时回复。不知道你的大获全胜是什么样的方法。

学习是自已研究出来的印象最深的,也最有体会。这也是开源学习的乐趣。

boa主要是实现精确定位,象delphi。不过我的确没怎么用过boa来做界面。使用wxPython我感觉手工编码如果熟悉之后并不是很麻烦,当然如果界面很复杂而且不希望使用sizer的话就另当别论。wxPython有几种sizer,简单的方法可以boxsizer套boxsizer。再有使用gridsizer,再套其它的sizer。
----
[Original] [Print] [Top]
Subject: Re: 请教:Boa 的 Sizer 不好用,怎么办?
Author: lawme    Posted: 2005-10-17 02:44    Length: 418 byte(s)
[Original] [Print] [Top]
我的办法很土,但简单实用:

  BoxSizer + spacer + 控件

用 spacer 调整控件位置。

如果要调整控件的水平位置,将 BoxSizer 的 Orientation 设成 HORIZONTAL

如果要调整控件的垂直位置,将 BoxSizer 的 Orientation 设成 VERTICAL

在 BoxSizer 中加入 spacer 和控件

设置 spacer 的大小,调整控件的位置

[Original] [Print] [Top]
« Previous thread
求助:python弹出确认是否删除对话框
Python 编 程
6
Next thread »
Q:请问如何防止一个 python 程序多次运行
     

Copyright © 2007 UNIX Resources Network, All Rights Reserved.      About URN | Privacy & Legal | Help | Contact us
备案序号: 京ICP备05006143    webmaster: webmaster@unixresources.net
This page created on 2008-07-17 04:11:02, cost 0.10048985481262 ms.