有一些控件不响应任何用户,只是用来显示一些信息或者怎加应用程序的美感,这些控件称之为静态控件。wxPython提供了一些常用的静态控件包括静态文本控件wx.StaticText,静态图片控件wx.StaticBitmap,静态分割线wx.StaticLine,静态框控件wx.StaticBox,以及进度显示条控件wx.Gauge等。
一、静态文本wx.StaticText
静态文本控件wx.StaticText用来显示一行或者多行的只读文本。
wx.StaticText支持三种经典的文本对齐方式。支持标签省略号,即如果标签不适合所提供的空间,则将部分文本替换为省略号(“…”),并使用wx.Control.SetLabelMarkup格式化标记。
wx.StaticText支持的窗口样式有:
- wx.ALIGN_LEFT:文本左对齐。
- wx.ALIGN_RIGHT:文本右对齐。
- wx.ALIGN_CENTRE_HORIZONTAL:文本水平居中对齐。
- wx.ST_NO_AUTORESIZE:默认情况下,静态文本控件会在调用SetLabel以后自动改变大小以使得其大小刚好满足标签文本的需要,如果设置了这个类型,则标签不会改变自己的大小。通常这个类型应该和上面的对齐类型一起使用因为如果没有设置这个类型,自动调整大小使得对齐没有任何意义。
- wx.ST_ELLIPSIZE_START:如果标签文本宽度超过控制宽度,则将标签的开头替换为省略号。
- wx.ST_ELLIPSIZE_MIDDLE:如果标签文本宽度超过控制宽度,则将标签中间替换为省略号。
- wx.ST_ELLIPSIZE_END:如果标签文本宽度超过控制宽度,则将标签的结尾替换为省略号。
wx.StaticText 常用方法:
- GetLabel(self):获取控件中显示的文本标签。
- SetLabel(self, label):更改控件中显示的文本标签。
- IsEllipsized(self):如果此控件的窗口样式包含ST_ELLIPSIZE_START、ST_ELLIPSIZE_MIDDLE或ST_ELLIPSIZE_END样式之一,则返回True。
- Wrap(self, width):文本超出设置宽度后自动换行。如果width为负,则不进行自动换行。注意,这个宽度不一定是控件的总宽度,因为可能会添加一些边框像素(取决于控件的边框样式)。
图1:wx.StaticText类继承关系
二、wx.StaticText演示
下面的代码演示如何创建和使用wx.StaticText。
#静态文本(wx.StaticText)
import wx
class SampleStaticText(wx.Frame):
def __init__(self, *args, **kw):
super(SampleStaticText, self).__init__(*args, **kw)
self.InitUi()
def InitUi(self):
#设置标题
self.SetTitle("实战wxPython: 静态文本演示")
#设置窗口尺寸
self.SetSize(400, 320)
txt1 = '''
白日依山尽,
黄河入海流。
欲穷千里目,
更上一层楼
'''
txt2 = '''
昔人已乘黄鹤去,此地空余黄鹤楼。
黄鹤一去不复返,白云千载空悠悠。
晴川历历汉阳树,芳草萋萋鹦鹉洲。
日暮乡关何处是?烟波江上使人愁。
'''
panel = wx.Panel(self)
vBox = wx.BoxSizer(wx.VERTICAL)
font = wx.Font(13, wx.DEFAULT, wx.NORMAL, wx.DEFAULT)
stcTxt1 = wx.StaticText(panel, label=txt1, style = wx.ALIGN_LEFT)
stcTxt2 = wx.StaticText(panel, label=txt2, style = wx.ALIGN_LEFT)
stcTxt1.SetFont(font)
stcTxt2.SetFont(font)
vBox.Add(stcTxt1, flag = wx.ALL, border = 10)
vBox.Add(stcTxt2, flag = wx.ALL, border = 10)
panel.SetSizer(vBox)
self.Centre()
def main():
app = wx.App()
sample = SampleStaticText(None)
sample.Show()
app.MainLoop()
if __name__ == "__main__":
main()
上述代码使用两个静态文本来显示两首唐诗。
图2:wx.StaticText演示
三、静态图片wx.StaticBitmap
静态位图控件wx.StaticBitmap用来显示一个位图。某些平台上的本机实现仅用于显示对话框中的小图标。注意,为了获得最佳效果,如果没有显式地调整大小,则默认情况是控件的大小应该与其中显示的图像的大小相同。可以使用SetScaleMode来控制图像在控件中的缩放方式。
wx.StaticBitmap的常用方法有:
- GetBitmap(self):返回控件中当前使用的位图。注意,即使使用了SetIcon,也可以调用此方法。
- GetIcon(self):返回控件中当前使用的图标。请注意,此方法只能在使用SetIcon时调用。如果已经设置了位图(使用wx.StaticBitmap.SetBitmap),则无法从控件中获得图标。
- GetScaleMode(self):返回控件当前使用的缩放模式。
- SetBitmap(self, label):设置控件使用的位图。
- SetIcon(self, label):设置控件使用的图标。
- SetScaleMode(self, scaleMode):设置控件使用的缩放方式。
图3:wx.staticBitmap类继承关系
四、wx. StaticBitmap演示
下面的代码演示如何创建和使用wx.StaticBitmap。
#静态位图(wx.StaticBitmap)
import wx
import os
class SampleStaticBitmap(wx.Frame):
def __init__(self, *args, **kw):
super(SampleStaticBitmap, self).__init__(*args, **kw)
self.InitUi()
def InitUi(self):
#设置标题
self.SetTitle("实战wxPython: StaticBitmap演示")
#设置窗口尺寸
self.SetSize(540, 320)
panel = wx.Panel(self)
bmpOn = wx.Image(os.path.dirname(__file__) + "/light_on.png", wx.BITMAP_TYPE_PNG).ConvertToBitmap()
bmpOff = wx.Image(os.path.dirname(__file__) + "/light_off.png", wx.BITMAP_TYPE_PNG).ConvertToBitmap()
wx.StaticBitmap(panel, wx.ID_ANY, bmpOn, pos = (10, 20), size = (256, 256))
wx.StaticBitmap(panel, wx.ID_ANY, bmpOff, pos = (280, 20), size = (256, 256))
self.Centre()
def main():
app = wx.App()
sample = SampleStaticBitmap(None)
sample.Show()
app.MainLoop()
if __name__ == "__main__":
main()
上述代码演示了使用wx.StaticBitmap在窗口指定位置上上显示位图。
图4:wx.StaticBitmap演示
五、静态分割线wx.StaticLine
这个控件用来在其父窗口上显示一个水平或者垂直的长条,以便作为子窗口的静态分割条。
相应的,其样式有两种:
- wx.LI_HORIZONTAL:生成一条水平线。
- wx.LI_VERTICAL:生成一条垂直线。
其常用方法有:
- IsVertical(self):如果线是垂直的,则返回True, 如果是水平的,则返沪False。
图5:wx.StaticLine类继承关系
六、wx.StaticLine演示
下面的代码演示如何创建和使用wx.StaticLine。
#分割线(wx.StaticLine)
import wx
class SampleStaticLine(wx.Frame):
def __init__(self, *args, **kw):
super(SampleStaticLine, self).__init__(*args, **kw)
self.InitUi()
def InitUi(self):
#设置标题
self.SetTitle("实战wxPython: StaticLine演示")
#设置窗口尺寸
self.SetSize(360, 340)
#面板
panel = wx.Panel(self)
#标题行
font = wx.Font(16, wx.DEFAULT, wx.NORMAL, wx.BOLD)
heading = wx.StaticText(panel, label="期末考试成绩", pos = (40, 15), size = (200, -1))
heading.SetFont(font)
#上分割线
wx.StaticLine(panel, pos = (30, 50), size = (240, 1))
#成绩数据列表
wx.StaticText(panel, label="语文", pos=(40, 60))
wx.StaticText(panel, label="115", pos = (240, 60))
wx.StaticText(panel, label="数学", pos=(40, 80))
wx.StaticText(panel, label="142", pos = (240, 80))
wx.StaticText(panel, label="英语", pos=(40, 100))
wx.StaticText(panel, label="136", pos = (240, 100))
wx.StaticText(panel, label="物理", pos=(40, 120))
wx.StaticText(panel, label="90", pos = (240, 120))
wx.StaticText(panel, label="化学", pos=(40, 140))
wx.StaticText(panel, label="92", pos = (240, 140))
wx.StaticText(panel, label="生物", pos=(40, 160))
wx.StaticText(panel, label="96", pos = (240, 160))
wx.StaticText(panel, label="地理", pos=(40, 180))
wx.StaticText(panel, label="93", pos = (240, 180))
wx.StaticText(panel, label="历史", pos=(40, 200))
wx.StaticText(panel, label="89", pos = (240, 200))
wx.StaticText(panel, label="政治", pos=(40, 220))
wx.StaticText(panel, label="82", pos = (240, 220))
#下分割线
wx.StaticLine(panel, pos = (30, 250), size=(240, 1))
#总成绩
score_sum = wx.StaticText(panel, label="", pos = (240, 270))
#将总成绩的字体设置为黑色
sum_font = score_sum.GetFont()
sum_font.SetWeight(wx.BOLD)
score_sum.SetFont(sum_font)
#关闭按钮
btnClose = wx.Button(panel, label="关闭", pos=(200, 260))
btnClose.Bind(wx.EVT_BUTTON, self.OnClose)
self.Centre()
def OnClose(self, e):
self.Close()
def main():
app = wx.App()
sample = SampleStaticLine(None)
sample.Show()
app.MainLoop()
if __name__ == "__main__":
main()
在上面的代码中,创建了两条水平分割线来区分窗口区域,运行结果如图6。
图6:wx.StaticLine演示
七、静态框wx.StaticBox
静态框wx.StaticBox是围绕其他窗口绘制的矩形,用于表示项目的逻辑分组。 这个控件可以有两种使用方式,一种是作为兄弟窗口环绕在其他控件周围,一种是将其作为父窗口,它所包围的控件作为其字窗口放在其中。
创建静态框和其中的控件的推荐方法是将其作为父窗口使用:
def CreateControls(self):
panel = wx.Panel(self)
box = wx.StaticBox(panel, wx.ID_ANY, "StaticBox")
text = wx.StaticText(box, wx.ID_ANY, "This window is a child of the staticbox")
# Other code...
wx.StaticBox常用方法有:
- Enable(self, enable=True):启用或禁用方框,但不影响其标签窗口(如果有)。
- GetBordersForSizer(self):返回StaticBox中边界可能需要的额外空间。
图7:wx.StaticBox类继承关系
八、wx.StaticBox演示
下面的代码演示如何创建和使用wx.StaticText。
#静态框(wx.StaticBox)
import wx
class SampleStaticBox(wx.Frame):
def __init__(self, *args, **kw):
super(SampleStaticBox, self).__init__(*args, **kw)
self.InitUi()
def InitUi(self):
#设置标题
self.SetTitle("实战wxPython: StaticBox演示")
#设置窗口尺寸
self.SetSize(360, 260)
panel = wx.Panel(self)
sbox = wx.StaticBox(panel, label="个人信息", pos = (5, 5), size=(240, 170))
#sbox.Enable(False)
# as parent
wx.CheckBox(sbox, label="男性", pos = (15, 30))
wx.CheckBox(sbox, label="已婚", pos = (15, 55))
wx.StaticText(sbox, label="年龄", pos = (15, 95))
wx.SpinCtrl(sbox, value="30", pos = (55, 90), size = (60, -1), min=1, max=120)
# as brother
'''
wx.CheckBox(panel, label="男性", pos = (15, 30))
wx.CheckBox(panel, label="已婚", pos = (15, 55))
wx.StaticText(panel, label="年龄", pos = (15, 95))
wx.SpinCtrl(panel, value="30", pos = (55, 90), size = (60, -1), min=1, max=120)
'''
btnOK = wx.Button(panel, label="确认", pos = (90, 185), size = (60, -1))
btnOK.Bind(wx.EVT_BUTTON, self.OnClose)
self.Centre()
def OnClose(self, e):
self.Close()
def main():
app = wx.App()
sample = SampleStaticBox(None)
sample.Show()
app.MainLoop()
if __name__ == "__main__":
main()
上述代码演示了wx.StaticBox作为父窗口和兄弟窗口的两种使用方式。
图8:wx.StaticBox演示
九、本文知识点
- 了解和使用wx.StaticText。
- 了解和使用wx.StaticBitmap。
- 了解和使用wx.StaticLine。
- 了解和使用wx.StaticBox。