2.6 如何为一个框架增加对象和子窗口?[wxPython In Action]

2.6 如何为一个框架增加对象和子窗口?

我们已经说明了如何创建wx.Frame对象,但是创建后的是空的。本节我们将介绍在你的框架中插入对象与子窗口的基础,以便与用户交互。

2.6.1 给框架增加窗口部件

图2.8显示了一个定制的wx.Frame的子类,名为InsertFrame。当点击close按钮时,这个窗口将关闭且应用程序将退出。例2.3定义了子类InsertFrame。


例2.3

#!/usr/bin/env python

import wx

class InsertFrame(wx.Frame):

def __init__(self, parent, id):
wx.Frame.__init__(self, parent, id, 'Frame With Button',
size=(300, 100))
panel = wx.Panel(self) #创建画板
button = wx.Button(panel, label="Close", pos=(125, 10),
size=(50, 50)) #将按钮添加到画板
#绑定按钮的单击事件
self.Bind(wx.EVT_BUTTON, self.OnCloseMe, button)
#绑定窗口的关闭事件
self.Bind(wx.EVT_CLOSE, self.OnCloseWindow)

def OnCloseMe(self, event):
self.Close(True)

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

if __name__ == '__main__':
app = wx.PySimpleApp()
frame = InsertFrame(parent=None, id=-1)
frame.Show()
app.MainLoop()

类InsertFrame 的方法__init__创建了两子窗口。第一个是wx.Panel,它是其它窗口的容器,它自身也有一点功能。第二个是wx.Button,它是一个平常 按钮。接下来,按钮的单击事件和窗口的关闭事件被绑定到了相应的函数,当事件发生时这相应的函数将被调用执行。

大多数情况下,你将创建一个与你的wx.Frame大小一样的wx.Panel实例以容纳你的框架上的所有的内容。这样做可以让定制的窗口内容与其他如工具栏和状态栏分开。 通过tab按钮,可以遍历wx.Panel中的元素,wx.Frame不能。

你不必像使用别的UI工具包那样,你不需要显式调用一个增加方法来向双亲中插入一个子窗口。在wxPython中,你只需在子窗口被创建时指定父窗口,这个子窗口就隐式地增加到父对象中了,例如例2.3所示。

你 可能想知道在例2.3中,为什么wx.Button被创建时使用了明确的位置和尺寸,而wx.Panel没有。在wxPython中,如果只有一个子窗口 的框架被创建,那么那个子窗口(例2.3中是wx.Panel)被自动重新调整尺寸去填满该框架的客户区域。这个自动调整尺寸将覆盖关于这个子窗口的任何 位置和尺寸信息,尽管关于子窗口的信息已被指定,这些信息将被忽略。这个自动调整尺寸仅适用于框架内或对话框内的只有唯一元素的情况。这里按钮是 panel的元素,而不是框架的,所以要使用指定的尺寸和位置。如果没有为这个按钮指定尺寸和位置,它将使用默认的位置(panel的左上角)和基于按钮 标签的长度的尺寸。

显式地指定所有子窗口的位置和尺寸是十分乏味的。更重要的是,当用户调整窗口大小的时候,这使得子窗口的位置和大小不能作相应调整。为了解决这两个问题,wxPython使用了称为sizers的对象来管理子窗口的复杂布局。

2.6.2 给框架增加菜单栏、工具栏和状态栏。

图2.9显示了一个有菜单栏、工具栏和状态栏的框架。

例2.4显示了__init__方法,它用这三个子窗口装饰了一个简单的窗口。
例2.4

#!/usr/bin/env python

import wx
import images

class ToolbarFrame(wx.Frame):
def __init__(self, parent, id):
wx.Frame.__init__(self, parent, id, 'Toolbars',
size=(300, 200))
panel = wx.Panel(self)
panel.SetBackgroundColour('White')
statusBar = self.CreateStatusBar() #1 创建状态栏
toolbar = self.CreateToolBar() #2 创建工具栏
toolbar.AddSimpleTool(wx.NewId(), images.getNewBitmap(),
"New", "Long help for 'New'") #3 给工具栏增加一个工具
toolbar.Realize() #4 准备显示工具栏
menuBar = wx.MenuBar() # 创建菜单栏
# 创建两个菜单
menu1 = wx.Menu()
menuBar.Append(menu1, "&File")
menu2 = wx.Menu()
#6 创建菜单的项目
menu2.Append(wx.NewId(), "&Copy", "Copy in status bar")
menu2.Append(wx.NewId(), "C&ut", "")
menu2.Append(wx.NewId(), "Paste", "")
menu2.AppendSeparator()
menu2.Append(wx.NewId(), "&Options...", "Display Options")
menuBar.Append(menu2, "&Edit") # 在菜单栏上附上菜单
self.SetMenuBar(menuBar) # 在框架上附上菜单栏


if __name__ == '__main__':
app = wx.PySimpleApp()
frame = ToolbarFrame(parent=None, id=-1)
frame.Show()
app.MainLoop()

说明:

#1:这行创建了一个状态栏,它是类wx.StatusBar的实例。它被放置在框架的底部,宽度与框架相同,高度由操作系统决定。状态栏的目的是显示在应用程序中被各种事件所设置的文本。
#2:创建了一个wx.ToolBar的实例,它是命令按钮的容器。它被自动放置在框架的顶部
#3:有两种方法来为你工具栏增加工具,这行使用了参数较少的一种:AddSimpleTool()。参数分别是ID,位图,该工具的短的帮助提示文本,显示在状态栏中的该工具的长的帮助文本信息。(此刻不要考虑位图从哪儿来)
#4:Realize()方法告诉工具栏这些工具按钮应该被放置在哪儿。这是必须的。
#6:创建菜单的项目,其中参数分别代表ID,选项的文本,当鼠标位于其上时显示在状态栏的文本。

2.7 如何使用一般的对话框?

wxPython提供了一套丰富的预定义的对话框。这部分,我们将讨论三种用对话框得到来自用户的信息:

1、消息对话框
2、文本输入对话框
3、从一个列表中选择

在wxPython中有许多别的标准对话框,包括文件选择器、色彩选择器、进度对话框、打印设置和字体选择器。这些将在第9章介绍。

消息对话框

与用户通信最基本的机制是wx.MessageDialog,它是一个简单的提示框。wx.MessageDialog可用作一个简单的OK框或yes/no对话框。下面的片断显示了yes/no对话框:

dlg = wx.MessageDialog(None, 'Is this the coolest thing ever!',
'MessageDialog', wx.YES_NO | wx.ICON_QUESTION)
result = dlg.ShowModal()
dlg.Destroy()

显示结果如图2.10所示:


wx.MessageDialog参数如下:

wx.MessageDialog(parent, message,
caption="Message box",
style=wx.OK | wx.CANCEL,
pos=wx.DefaultPosition)

参数说明

parent:对话框的父窗口,如果对话框是顶级的则为None。
message:显示在对话框中的字符串。
caption:显示在对话框标题栏上的字符串。
style:对话框中按钮的样式。
pos:对话框出现的位置。

ShowModal ()方法将对话框以模式框架的方式显示,这意味着在对话框关闭之前,应用程序中的别的窗口不能响应用户事件。ShowModal()方法的返回值是一个整 数,对于wx.MessageDialog,返回值是下面常量之一: wx.ID_YES, wx.ID_NO, wx.ID_CANCEL, wx.ID_OK。

文本输入对话框

如果你想从用户那里得到单独一行文本,你可能使用类wx.TextEntryDialog。下面的片断创建了一个文本输入域,当用户单击OK按钮退出时,获得用户输入的值:

dlg = wx.TextEntryDialog(None, "Who is buried in Grant's tomb?",
'A Question', 'Cary Grant')
if dlg.ShowModal() == wx.ID_OK:
response = dlg.GetValue()

图2.11显示了上面这个对话框:


上 面的wx.TextEntryDialog的参数按顺序说明是,父窗口,显示在窗口中的文本标签,窗口的标题(默认是 “Please enter text”),输入域中的默认值。同样它也有一个样式参数,默认是wx.OK | wx.CANCEL。与 wx.MessageDialog一样,ShowModal()方法返回所按下的按钮的ID。GetValue()方法得到用户输入在文本域中的值(这有 一个相应的SetValue()方法让你可以改变文本域中的值)。

从一个列表中选择

你可以让用户只能从你所提供的列表中选择,你可以使用类wx.SingleChoiceDialog。下面是一个简单的用法:

dlg = wx.SingleChoiceDialog(None,
'What version of Python are you using?',
'Single Choice',
['1.5.2', '2.0', '2.1.3', '2.2', '2.3.1'],
if dlg.ShowModal() == wx.ID_OK:
response = dlg.GetStringSelection()

图2.12显示了上面代码片断的结果。

wx.SingleChoiceDialog 的参数类似于文本输入对话框,只是以字符串的列表代替了默认的字符串文本。要得到所选择的结果有两种方法,GetSelection()方法返回用户选项 的索引,而GetStringSelection()返回实际所选的字符串。
posted @ 2008-01-30 12:54  Yoshow  阅读(1857)  评论(0)    收藏  举报