This commit was manufactured by cvs2svn to create tag

'WX_2_4_FIRST_MERGE'.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/tags/WX_2_4_FIRST_MERGE@18039 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Bryan Petty
2002-12-04 12:17:24 +00:00
parent bf4a027ddb
commit 3bb6681dc4
1347 changed files with 53004 additions and 40615 deletions

View File

@@ -124,7 +124,8 @@ class DoodleDropTarget(wxPyDropTarget):
self.dv = window
# specify the type of data we will accept
self.data = wxCustomDataObject(wxCustomDataFormat("DoodleLines"))
self.df = wxCustomDataFormat("DoodleLines")
self.data = wxCustomDataObject(self.df)
self.SetDataObject(self.data)
@@ -326,21 +327,20 @@ if __name__ == '__main__':
#----------------------------------------------------------------------
overview = """<html><body>
This demo shows Drag and Drop using a custom data type and a custom
data object. A type called "DoodleLines" is created and a Python
Pickle of a list is actually transfered in the drag and drop
opperation.
A second data object is also created containing a bitmap of the image
and is made available to any drop target that accepts bitmaps, such as
MS Word.
overview = """\
This demo shows Drag and Drop using a custom data type and a custom data object. A type called "DoodleLines" is created and a Python Pickle of a list is actually transfered in the drag and drop opperation.
A second data object is also created containing a bitmap of the image and is made available to any drop target that accepts bitmaps, such as MS Word.
The two data objects are combined in a wxDataObjectComposite and the rest is handled by the framework.
The two data objects are combined in a wxDataObjectComposite and the
rest is handled by the framework.
</body></html>
"""

View File

@@ -46,6 +46,12 @@ class TestPanel(wxPanel):
EVT_BUTTON(self, b.GetId(), self.OnButton)
sizer.Add(b)
bmp = images.getTest2Bitmap()
b = wxGenBitmapButton(self, -1, bmp)
EVT_BUTTON(self, b.GetId(), self.OnButton)
sizer.Add(b)
b.Enable(FALSE)
b = wxGenBitmapButton(self, -1, None)
EVT_BUTTON(self, b.GetId(), self.OnButton)
bmp = images.getBulb1Bitmap()
@@ -58,7 +64,6 @@ class TestPanel(wxPanel):
b.SetBitmapSelected(bmp)
b.SetBestSize()
sizer.Add(b)
sizer.Add(10,10)
b = wxGenToggleButton(self, -1, "Toggle Button")
EVT_BUTTON(self, b.GetId(), self.OnToggleButton)
@@ -128,3 +133,11 @@ def runTest(frame, nb, log):
import wxPython.lib.buttons
overview = wxPython.lib.buttons.__doc__
if __name__ == '__main__':
import sys,os
import run
run.main(['', os.path.basename(sys.argv[0])])

View File

@@ -149,6 +149,7 @@ class MyCellEditor(wxPyGridCellEditor):
# For this example, replace the text. Normally we would append it.
#self._tc.AppendText(ch)
self._tc.SetValue(ch)
self._tc.SetInsertionPointEnd()
else:
evt.Skip()

View File

@@ -45,7 +45,10 @@ class CustomDataTable(wxPyGridTableBase):
return len(self.data[0])
def IsEmptyCell(self, row, col):
return not self.data[row][col]
try:
return not self.data[row][col]
except IndexError:
return true
# Get/Set values in the table. The Python version of these
# methods can handle any data-type, (as long as the Editor and
@@ -138,8 +141,22 @@ class CustTableGrid(wxGrid):
class TestFrame(wxFrame):
def __init__(self, parent, log):
wxFrame.__init__(self, parent, -1, "Custom Table, data driven Grid Demo", size=(640,480))
grid = CustTableGrid(self, log)
p = wxPanel(self, -1, style=0)
grid = CustTableGrid(p, log)
b = wxButton(p, -1, "Another Control...")
b.SetDefault()
EVT_BUTTON(self, b.GetId(), self.OnButton)
EVT_SET_FOCUS(b, self.OnButtonFocus)
bs = wxBoxSizer(wxVERTICAL)
bs.Add(grid, 1, wxGROW|wxALL, 5)
bs.Add(b)
p.SetSizer(bs)
def OnButton(self, evt):
print "button selected"
def OnButtonFocus(self, evt):
print "button focus"
#---------------------------------------------------------------------------

View File

@@ -28,7 +28,7 @@ class SimpleGrid(wxGrid): ##, wxGridAutoEditMixin):
self.SetCellBackgroundColour(2, 2, wxCYAN)
self.SetReadOnly(3, 3, true)
self.SetCellEditor(5, 0, wxGridCellNumberEditor())
self.SetCellEditor(5, 0, wxGridCellNumberEditor(1,1000))
self.SetCellValue(5, 0, "123")
self.SetCellEditor(6, 0, wxGridCellFloatEditor())
self.SetCellValue(6, 0, "123.34")
@@ -53,6 +53,14 @@ class SimpleGrid(wxGrid): ##, wxGridAutoEditMixin):
self.SetColLabelAlignment(wxALIGN_LEFT, wxALIGN_BOTTOM)
# overflow cells
self.SetCellValue( 9, 1, "This default cell will overflow into neighboring cells, but not if you turn overflow off.");
self.SetCellSize(11, 1, 3, 3);
self.SetCellAlignment(11, 1, wxALIGN_CENTRE, wxALIGN_CENTRE);
self.SetCellValue(11, 1, "This cell is set to span 3 rows and 3 columns");
# test all the events
EVT_GRID_CELL_LEFT_CLICK(self, self.OnCellLeftClick)
EVT_GRID_CELL_RIGHT_CLICK(self, self.OnCellRightClick)

View File

@@ -25,18 +25,8 @@ import images
_treeList = [
# new stuff
('New since last release', [
'RowColSizer',
'Unicode',
'wxFileHistory',
'wxGenericDirCtrl',
'wxImageFromStream',
'wxArtProvider',
'ScrolledPanel',
'wxMenu',
'wxIEHtmlWin',
'wxKeyEvents',
'wxWizard',
'wxXmlResourceHandler',
'wxRadioButton',
]),
# managed windows == things with a caption you can close
@@ -88,6 +78,7 @@ _treeList = [
'wxNotebook',
'wxPopupWindow',
'wxRadioBox',
'wxRadioButton',
'wxSashWindow',
'wxSlider',
'wxScrolledWindow',
@@ -129,6 +120,7 @@ _treeList = [
'wxRightTextCtrl',
'wxStyledTextCtrl_1',
'wxStyledTextCtrl_2',
'wxTimeCtrl',
]),
# How to lay out the controls in a frame/dialog
@@ -358,7 +350,7 @@ class wxPythonDemo(wxFrame):
# Set up a TextCtrl on the Demo Code Notebook page
self.txt = wxTextCtrl(self.nb, -1,
style = wxTE_MULTILINE|wxTE_READONLY|wxHSCROLL)
style = wxTE_MULTILINE|wxTE_READONLY|wxHSCROLL|wxTE_RICH2)
self.nb.AddPage(self.txt, "Demo Code")

View File

@@ -4,24 +4,30 @@
</head>
<body bgcolor="#00CCFF">
<h2>Mixing wxPython and wxHTML</h2>
The widgets on this page were created dynamically on the fly by a custom
wxTagHandler found in wxPython.lib.wxpTag. You can look at the sources
and doc-string <a href="../../lib/wxpTag.py">here</a>.
The widgets on this page were created dynamically on the fly by a
custom wxTagHandler found in wxPython.lib.wxpTag. You can look at the
sources and doc-string <a href="../../lib/wxpTag.py">here</a>.
<p>
The button below is added to the page like this:
<pre>
&lt;center>&lt;wxp class="wxButton" width="50%">
&lt;param name="label" value="It works!">
&lt;param name="id" value="wxID_OK">
&lt;/wxp>&lt;/center>
</pre>
<hr>
<center>
<wxp class="wxButton" width="50%">
<param name="label" value="It works!">
<param name="id" value="wxID_OK">
</wxp>
</center>
<p>
Notice that the <b>button click</b> event is actually caught by the panel
that contains this window, which then logs it in the window below.

View File

@@ -25,7 +25,9 @@ from wxPython.wx import *
class Log:
def WriteText(self, text):
sys.stdout.write(text)
if text[-1:] == '\n':
text = text[:-1]
wxLogMessage(text)
write = WriteText
@@ -38,6 +40,8 @@ class RunDemoApp(wxApp):
def OnInit(self):
wxInitAllImageHandlers()
wxLog_SetActiveTarget(wxLogStderr())
frame = wxFrame(None, -1, "RunDemo: " + self.name, size=(0,0),
style=wxNO_FULL_REPAINT_ON_RESIZE|wxDEFAULT_FRAME_STYLE)
frame.CreateStatusBar()

View File

@@ -19,19 +19,33 @@ class TestPanel(wxPanel):
b = wxButton(self, 20, "HELLO AGAIN!", wxPoint(20, 60), wxSize(120, 45))
EVT_BUTTON(self, 20, self.OnClick)
b.SetToolTipString("This is a Hello button...")
bmp = images.getTest2Bitmap()
mask = wxMaskColour(bmp, wxBLUE)
bmp.SetMask(mask)
if 0: # a test case for catching wxPyAssertionError
#wxGetApp().SetAssertMode(wxPYAPP_ASSERT_SUPPRESS)
#wxGetApp().SetAssertMode(wxPYAPP_ASSERT_EXCEPTION)
#wxGetApp().SetAssertMode(wxPYAPP_ASSERT_DIALOG)
#wxGetApp().SetAssertMode(wxPYAPP_ASSERT_EXCEPTION | wxPYAPP_ASSERT_DIALOG)
try:
bmp = wxBitmap("nosuchfile.bmp", wxBITMAP_TYPE_BMP)
mask = wxMaskColour(bmp, wxBLUE)
except wxPyAssertionError:
self.log.write("Caught wxPyAssertionError! I will fix the problem.\n")
bmp = images.getTest2Bitmap()
mask = wxMaskColour(bmp, wxBLUE)
else:
bmp = images.getTest2Bitmap()
mask = wxMaskColour(bmp, wxBLUE)
bmp.SetMask(mask)
wxBitmapButton(self, 30, bmp, wxPoint(160, 20),
wxSize(bmp.GetWidth()+10, bmp.GetHeight()+10))
EVT_BUTTON(self, 30, self.OnClick)
def OnClick(self, event):
self.log.WriteText("Click! (%d)\n" % event.GetId())
self.log.write("Click! (%d)\n" % event.GetId())
#----------------------------------------------------------------------
@@ -43,15 +57,19 @@ def runTest(frame, nb, log):
#----------------------------------------------------------------------
overview = """<html><body>
<h2>wxButton</h2>
A button is a control that contains a text string or a bitmap and cab be
placed on nearly any kind of window.
overview = """\
</body></html>
"""
if __name__ == '__main__':
import sys,os
import run
run.main(['', os.path.basename(sys.argv[0])])

View File

@@ -22,7 +22,8 @@ class TestPanel(wxPanel):
lb.SetSelection(0)
self.lb = lb
btn = wxButton(self, -1, "Test SetString", (180, 50))
pos = lb.GetPosition().x + lb.GetSize().width + 25
btn = wxButton(self, -1, "Test SetString", (pos, 50))
EVT_BUTTON(self, btn.GetId(), self.OnTestButton)
EVT_RIGHT_UP(self, self.OnDoPopup)

View File

@@ -4,7 +4,10 @@ from wxPython.wx import *
#---------------------------------------------------------------------------
def runTest(frame, nb, log):
win = wxDialog(frame, -1, "This is a wxDialog", size=wxSize(350, 200), style=wxCAPTION)
win = wxDialog(frame, -1, "This is a wxDialog", size=wxSize(350, 200),
style = wxCAPTION | wxSYSTEM_MENU | wxTHICK_FRAME
#style = wxDEFAULT_DIALOG_STYLE
)
sizer = wxBoxSizer(wxVERTICAL)
@@ -63,10 +66,13 @@ def runTest(frame, nb, log):
overview = """\
"""
if __name__ == '__main__':
import sys,os
import run
run.main(['', os.path.basename(sys.argv[0])])

View File

@@ -43,6 +43,23 @@ class MyHtmlWindow(wxHtmlWindow):
self.base_OnCellClicked(cell, x, y, evt)
# This filter doesn't really do anything but show how to use filters
class MyHtmlFilter(wxHtmlFilter):
def __init__(self, log):
wxHtmlFilter.__init__(self)
self.log = log
# This method decides if this filter is able to read the file
def CanRead(self, fsfile):
self.log.write("CanRead: %s\n" % fsfile.GetMimeType())
return FALSE
# If CanRead returns true then this method is called to actually
# read the file and return the contents.
def ReadFile(self, fsfile):
return ""
class TestHtmlPanel(wxPanel):
def __init__(self, parent, frame, log):
wxPanel.__init__(self, parent, -1, style=wxNO_FULL_REPAINT_ON_RESIZE)
@@ -52,6 +69,8 @@ class TestHtmlPanel(wxPanel):
if not self.cwd:
self.cwd = os.getcwd()
wxHtmlWindow_AddFilter(MyHtmlFilter(log))
self.html = MyHtmlWindow(self, -1, log)
self.html.SetRelatedFrame(frame, "wxPython: (A Demonstration) -- %s")
self.html.SetRelatedStatusBar(0)
@@ -168,15 +187,27 @@ def runTest(frame, nb, log):
overview = """\
wxHtmlWindow is capable of parsing and rendering most simple HTML tags.
overview = """<html><body>
<h2>wxHtmlWindow</h2>
It is not intended to be a high-end HTML browser. If you're looking for something like that try http://www.mozilla.org - there's a chance you'll be able to make their widget wxWindows-compatible. I'm sure everyone will enjoy your work in that case...
<p>wxHtmlWindow is capable of parsing and rendering most
simple HTML tags.
<p>It is not intended to be a high-end HTML browser. If you're
looking for something like that try http://www.mozilla.org - there's a
chance you'll be able to make their widget wxWindows-compatible. I'm
sure everyone will enjoy your work in that case...
</body></html>
"""
if __name__ == '__main__':
import sys,os
import run
run.main(['', os.path.basename(sys.argv[0])])

View File

@@ -9,7 +9,7 @@ if wxPlatform == '__WXMSW__':
class TestPanel(wxWindow):
def __init__(self, parent, log, frame=None):
wxWindow.__init__(self, parent, -1,
style=wxCLIP_CHILDREN|wxNO_FULL_REPAINT_ON_RESIZE)
style=wxTAB_TRAVERSAL|wxCLIP_CHILDREN|wxNO_FULL_REPAINT_ON_RESIZE)
self.log = log
self.current = "http://wxWindows.org/"
self.frame = frame

View File

@@ -10,7 +10,7 @@ class TestPanel(wxPanel):
def __init__(self, parent, log):
wxPanel.__init__(self, parent, -1)
data = open(opj('bitmaps/image.gif'), "rb").read()
data = open(opj('bitmaps/image.png'), "rb").read()
stream = StringIO(data)
bmp = wxBitmapFromImage( wxImageFromStream( stream ))
@@ -18,8 +18,7 @@ class TestPanel(wxPanel):
wxStaticText(self, -1,
"This image was loaded from a Python file-like object:",
(15, 15))
wxStaticBitmap(self, -1, bmp, (15, 45))
wxStaticBitmap(self, -1, bmp, (15, 45))#, (bmp.GetWidth(), bmp.GetHeight()))

View File

@@ -10,10 +10,12 @@ class wxFindPrefixListBox(wxListBox):
choices=[], style=0, validator=wxDefaultValidator):
wxListBox.__init__(self, parent, id, pos, size, choices, style, validator)
self.typedText = ''
EVT_KEY_UP(self, self.OnKey)
self.log = parent.log
EVT_KEY_DOWN(self, self.OnKey)
def FindPrefix(self, prefix):
self.log.WriteText('Looking for prefix: %s\n' % prefix)
if prefix:
prefix = string.lower(prefix)
length = len(prefix)
@@ -21,7 +23,9 @@ class wxFindPrefixListBox(wxListBox):
text = self.GetString(x)
text = string.lower(text)
if text[:length] == prefix:
self.log.WriteText('Prefix %s is found.\n' % prefix)
return x
self.log.WriteText('Prefix %s is not found.\n' % prefix)
return -1
@@ -43,8 +47,12 @@ class wxFindPrefixListBox(wxListBox):
self.SetSelection(item)
else:
self.typedText = ''
evt.Skip()
def OnKeyDown(self, evt):
pass
#---------------------------------------------------------------------------
@@ -90,7 +98,9 @@ class TestListBox(wxPanel):
def EvtListBox(self, event):
self.log.WriteText('EvtListBox: %s\n' % event.GetString())
self.log.WriteText('EvtListBox: %s, %s, %s\n' %
(event.GetString(), event.IsSelection(), event.GetSelection()))
lb = event.GetEventObject()
data = lb.GetClientData(lb.GetSelection())
if data is not None:
@@ -127,14 +137,19 @@ def runTest(frame, nb, log):
overview = """\
A listbox is used to select one or more of a list of strings. The strings are displayed in a scrolling box, with the selected string(s) marked in reverse video. A listbox can be single selection (if an item is selected, the previous selection is removed) or multiple selection (clicking an item toggles the item on or off independently of other selections).
overview = """<html><body>
A listbox is used to select one or more of a list of
strings. The strings are displayed in a scrolling box, with the
selected string(s) marked in reverse video. A listbox can be single
selection (if an item is selected, the previous selection is removed)
or multiple selection (clicking an item toggles the item on or off
independently of other selections).
</body></html>
"""
if __name__ == '__main__':
import sys,os
import run
run.main(['', os.path.basename(sys.argv[0])])

View File

@@ -191,7 +191,9 @@ class TestListCtrlPanel(wxPanel, wxColumnSorterMixin):
self.x = event.GetX()
self.y = event.GetY()
self.log.WriteText("x, y = %s\n" % str((self.x, self.y)))
print event.GetEventObject()
item, flags = self.list.HitTest((self.x, self.y))
if flags & wxLIST_HITTEST_ONITEM:
self.list.Select(item)
event.Skip()
@@ -213,17 +215,19 @@ class TestListCtrlPanel(wxPanel, wxColumnSorterMixin):
# this does
self.list.SetItemState(10, 0, wxLIST_STATE_SELECTED)
# Show how to reselect something we don't want deselected
def OnItemDeselected(self, evt):
item = evt.GetItem()
print evt.m_itemIndex
self.log.WriteText("OnItemDeselected: %d" % evt.m_itemIndex)
# Show how to reselect something we don't want deselected
if evt.m_itemIndex == 11:
wxCallAfter(self.list.SetItemState, 11, wxLIST_STATE_SELECTED, wxLIST_STATE_SELECTED)
def OnItemActivated(self, event):
self.currentItem = event.m_itemIndex
self.log.WriteText("OnItemActivated: %s\n" % self.list.GetItemText(self.currentItem))
self.log.WriteText("OnItemActivated: %s\nTopItem: %s" %
(self.list.GetItemText(self.currentItem), self.list.GetTopItem()))
def OnItemDelete(self, event):
self.log.WriteText("OnItemDelete\n")

View File

@@ -45,7 +45,8 @@ class TestVirtualList(wxListCtrl):
def OnItemActivated(self, event):
self.currentItem = event.m_itemIndex
self.log.WriteText("OnItemActivated: %s\n" % self.GetItemText(self.currentItem))
self.log.WriteText("OnItemActivated: %s\nTopItem: %s\n" %
(self.GetItemText(self.currentItem), self.GetTopItem()))
def getColumnText(self, index, col):
item = self.GetItem(index, col)

View File

@@ -70,7 +70,7 @@ class TestPanel(wxPanel):
self.process = wxProcess(self)
self.process.Redirect();
pid = wxExecute(cmd, false, self.process)
pid = wxExecute(cmd, wxEXEC_ASYNC, self.process)
self.log.write('OnExecuteBtn: "%s" pid: %s\n' % (cmd, pid))
self.inp.Enable(true)
@@ -99,11 +99,7 @@ class TestPanel(wxPanel):
if self.process is not None:
stream = self.process.GetInputStream()
# Yes, this is weird. For this particular stream, EOF
# simply means that there is no data available to be read,
# not truly the end of file. Also, read() just reads all
# the currently available data, not until the real EOF...
if not stream.eof():
if stream.CanRead():
text = stream.read()
self.out.AppendText(text)
@@ -113,7 +109,7 @@ class TestPanel(wxPanel):
(evt.GetPid(), evt.GetExitCode()))
stream = self.process.GetInputStream()
if not stream.eof():
if stream.CanRead():
text = stream.read()
self.out.AppendText(text)

View File

@@ -3,10 +3,13 @@ from wxPython.wx import *
#---------------------------------------------------------------------------
RBOX1 = wxNewId()
RBOX2 = wxNewId()
RBUT1 = wxNewId()
RBUT2 = wxNewId()
RBUT3 = wxNewId()
RBUT4 = wxNewId()
RBOX1 = wxNewId()
RBOX2 = wxNewId()
class TestRadioButtons(wxPanel):
def __init__(self, parent, log):
@@ -33,15 +36,6 @@ class TestRadioButtons(wxPanel):
rb.SetToolTip(wxToolTip("This box has no label"))
sizer.Add(rb, 0, wxLEFT|wxRIGHT|wxBOTTOM, 20)
sizer.Add(wxStaticText(self, -1, "These are plain wxRadioButtons"),
0, wxLEFT|wxRIGHT, 20)
sizer.Add(wxRadioButton(self, RBUT1, "wxRadioButton 1"),
0, wxLEFT|wxRIGHT, 20)
sizer.Add(wxRadioButton(self, RBUT2, "wxRadioButton 2"),
0, wxLEFT|wxRIGHT, 20)
EVT_RADIOBUTTON(self, RBUT1, self.EvtRadioButton)
EVT_RADIOBUTTON(self, RBUT2, self.EvtRadioButton)
self.SetSizer(sizer)
@@ -49,7 +43,7 @@ class TestRadioButtons(wxPanel):
self.log.WriteText('EvtRadioBox: %d\n' % event.GetInt())
def EvtRadioButton(self, event):
self.log.write('EvtRadioButton:%d\n' % event.GetInt())
self.log.write('EvtRadioButton:%d\n' % event.GetId())
#---------------------------------------------------------------------------
@@ -57,21 +51,19 @@ def runTest(frame, nb, log):
win = TestRadioButtons(nb, log)
return win
#---------------------------------------------------------------------------
overview = """\
A radio box item is used to select one of number of mutually exclusive choices. It is displayed as a vertical column or horizontal row of labelled buttons.
A radio box item is used to select one of number of mutually exclusive
choices. It is displayed as a vertical column or horizontal row of
labelled buttons.
"""
if __name__ == '__main__':
import sys,os
import run
run.main(['', os.path.basename(sys.argv[0])])

View File

@@ -0,0 +1,118 @@
from wxPython.wx import *
#----------------------------------------------------------------------
class TestPanel( wxPanel ):
def __init__( self, parent, log ):
wxPanel.__init__( self, parent, -1 )
self.log = log
panel = wxPanel( self, -1 )
# 1st group of controls:
self.group1_ctrls = []
radio1 = wxRadioButton( panel, -1, "Radio1", style = wxRB_GROUP )
text1 = wxTextCtrl( panel, -1, "" )
radio2 = wxRadioButton( panel, -1, "Radio2" )
text2 = wxTextCtrl( panel, -1, "" )
radio3 = wxRadioButton( panel, -1, "Radio3" )
text3 = wxTextCtrl( panel, -1, "" )
self.group1_ctrls.append((radio1, text1))
self.group1_ctrls.append((radio2, text2))
self.group1_ctrls.append((radio3, text3))
# 2nd group of controls:
self.group2_ctrls = []
radio4 = wxRadioButton( panel, -1, "Radio1", style = wxRB_GROUP )
text4 = wxTextCtrl( panel, -1, "" )
radio5 = wxRadioButton( panel, -1, "Radio2" )
text5 = wxTextCtrl( panel, -1, "" )
radio6 = wxRadioButton( panel, -1, "Radio3" )
text6 = wxTextCtrl( panel, -1, "" )
self.group2_ctrls.append((radio4, text4))
self.group2_ctrls.append((radio5, text5))
self.group2_ctrls.append((radio6, text6))
# Layout controls on panel:
vs = wxBoxSizer( wxVERTICAL )
box1_title = wxStaticBox( panel, -1, "Group 1" )
box1 = wxStaticBoxSizer( box1_title, wxVERTICAL )
grid1 = wxFlexGridSizer( 0, 2, 0, 0 )
for radio, text in self.group1_ctrls:
grid1.AddWindow( radio, 0, wxALIGN_CENTRE|wxLEFT|wxRIGHT|wxTOP, 5 )
grid1.AddWindow( text, 0, wxALIGN_CENTRE|wxLEFT|wxRIGHT|wxTOP, 5 )
box1.AddSizer( grid1, 0, wxALIGN_CENTRE|wxALL, 5 )
vs.AddSizer( box1, 0, wxALIGN_CENTRE|wxALL, 5 )
box2_title = wxStaticBox( panel, -1, "Group 2" )
box2 = wxStaticBoxSizer( box2_title, wxVERTICAL )
grid2 = wxFlexGridSizer( 0, 2, 0, 0 )
for radio, text in self.group2_ctrls:
grid2.AddWindow( radio, 0, wxALIGN_CENTRE|wxLEFT|wxRIGHT|wxTOP, 5 )
grid2.AddWindow( text, 0, wxALIGN_CENTRE|wxLEFT|wxRIGHT|wxTOP, 5 )
box2.AddSizer( grid2, 0, wxALIGN_CENTRE|wxALL, 5 )
vs.AddSizer( box2, 0, wxALIGN_CENTRE|wxALL, 5 )
panel.SetSizer( vs )
vs.Fit( panel )
panel.Move( (50,50) )
self.panel = panel
# Setup event handling and initial state for controls:
for radio, text in self.group1_ctrls:
EVT_RADIOBUTTON( self, radio.GetId(), self.OnGroup1Select )
for radio, text in self.group2_ctrls:
EVT_RADIOBUTTON( self, radio.GetId(), self.OnGroup2Select )
for radio, text in self.group1_ctrls + self.group2_ctrls:
radio.SetValue(0)
text.Enable(FALSE)
def OnGroup1Select( self, event ):
radio_selected = event.GetEventObject()
self.log.write('Group1 %s selected\n' % radio_selected.GetLabel() )
for radio, text in self.group1_ctrls:
if radio is radio_selected:
text.Enable(TRUE)
else:
text.Enable(FALSE)
def OnGroup2Select( self, event ):
radio_selected = event.GetEventObject()
self.log.write('Group2 %s selected\n' % radio_selected.GetLabel() )
for radio, text in self.group2_ctrls:
if radio is radio_selected:
text.Enable(TRUE)
else:
text.Enable(FALSE)
#----------------------------------------------------------------------
def runTest( frame, nb, log ):
win = TestPanel( nb, log )
return win
#----------------------------------------------------------------------
overview = """
<html>
<P>
This demo shows how individual radio buttons can be used to build
more complicated selection mechanisms...
<P>
It uses 2 groups of wxRadioButtons, where the groups are defined by
instantiation. When a wxRadioButton is created with the <I>wxRB_GROUP</I>
style, all subsequent wxRadioButtons created without it are implicitly
added to that group by the framework.
"""
if __name__ == '__main__':
import sys,os
import run
run.main(['', os.path.basename(sys.argv[0])])

View File

@@ -149,6 +149,7 @@ class MyCanvas(wxScrolledWindow):
def OnLeftButtonEvent(self, event):
if event.LeftDown():
self.SetFocus()
self.SetXY(event)
self.curLine = []
self.CaptureMouse()

View File

@@ -20,50 +20,64 @@ class TestPanel(wxPanel):
self.log = log
l1 = wxStaticText(self, -1, "wxTextCtrl")
t1 = wxTextCtrl(self, 10, "Test it out and see", size=(125, -1))
t1 = wxTextCtrl(self, -1, "Test it out and see", size=(125, -1))
t1.SetInsertionPoint(0)
EVT_TEXT(self, 10, self.EvtText)
self.tc1 = t1
EVT_TEXT(self, t1.GetId(), self.EvtText)
EVT_CHAR(t1, self.EvtChar)
EVT_SET_FOCUS(t1, self.OnSetFocus)
EVT_KILL_FOCUS(t1, self.OnKillFocus)
EVT_WINDOW_DESTROY(t1, self.OnWindowDestroy)
l2 = wxStaticText(self, -1, "Passsword")
t2 = wxTextCtrl(self, 20, "", size=(125, -1), style=wxTE_PASSWORD)
EVT_TEXT(self, 20, self.EvtText)
t2 = wxTextCtrl(self, -1, "", size=(125, -1), style=wxTE_PASSWORD)
EVT_TEXT(self, t2.GetId(), self.EvtText)
l3 = wxStaticText(self, -1, "Multi-line")
t3 = wxTextCtrl(self, 30,
t3 = wxTextCtrl(self, -1,
"Here is a looooooooooooooong line of text set in the control.\n\n"
"The quick brown fox jumped over the lazy dog...",
size=(200, 100), style=wxTE_MULTILINE)
t3.SetInsertionPoint(0)
EVT_TEXT(self, 30, self.EvtText)
EVT_TEXT(self, t3.GetId(), self.EvtText)
b = wxButton(self, -1, "Test Replace")
EVT_BUTTON(self, b.GetId(), self.OnTestReplace)
b2 = wxButton(self, -1, "Test GetSelection")
EVT_BUTTON(self, b2.GetId(), self.OnTestGetSelection)
b3 = wxButton(self, -1, "Test WriteText")
EVT_BUTTON(self, b3.GetId(), self.OnTestWriteText)
self.tc = t3
l4 = wxStaticText(self, -1, "Rich Text")
t4 = wxTextCtrl(self, 40, "If supported by the native control, this is red, and this is a different font.",
t4 = wxTextCtrl(self, -1, "If supported by the native control, this is red, and this is a different font.",
size=(200, 100), style=wxTE_MULTILINE|wxTE_RICH2)
t4.SetInsertionPoint(0)
t4.SetStyle(44, 47, wxTextAttr("RED", "YELLOW"))
points = t4.GetFont().GetPointSize() # get the current size
f = wxFont(points+3, wxROMAN, wxITALIC, wxBOLD, true)
t4.SetStyle(63, 77, wxTextAttr("BLUE", wxNullColour, f))
l5 = wxStaticText(self, -1, "Test Positions")
t5 = wxTextCtrl(self, -1, "0123456789\n" * 5, size=(200, 100),
style = wxTE_MULTILINE
#| wxTE_RICH
| wxTE_RICH2
)
EVT_LEFT_DOWN(t5, self.OnT5LeftDown)
self.t5 = t5
bsizer = wxBoxSizer(wxVERTICAL)
bsizer.Add(b, 0, wxGROW)
bsizer.Add(b2, 0, wxGROW)
bsizer.Add(b, 0, wxGROW|wxALL, 4)
bsizer.Add(b2, 0, wxGROW|wxALL, 4)
bsizer.Add(b3, 0, wxGROW|wxALL, 4)
sizer = wxFlexGridSizer(cols=3, hgap=6, vgap=6)
sizer.AddMany([ l1, t1, (0,0),
l2, t2, (0,0),
l3, t3, bsizer,
l4, t4, (0,0),
l5, t5, (0,0),
])
border = wxBoxSizer(wxVERTICAL)
border.Add(sizer, 0, wxALL, 25)
@@ -84,6 +98,9 @@ class TestPanel(wxPanel):
self.tc.Replace(5, 9, "IS A")
#self.tc.Remove(5, 9)
def OnTestWriteText(self, evt):
self.tc.WriteText("TEXT")
def OnTestGetSelection(self, evt):
start, end = self.tc.GetSelection()
text = self.tc.GetValue()
@@ -96,6 +113,22 @@ class TestPanel(wxPanel):
self.tc.GetStringSelection(),
repr(text[start:end])))
def OnT5LeftDown(self, evt):
evt.Skip()
wxCallAfter(self.LogT5Position, evt)
def LogT5Position(self, evt):
text = self.t5.GetValue()
ip = self.t5.GetInsertionPoint()
lp = self.t5.GetLastPosition()
self.log.write("LogT5Position:\n"
"\tGetInsertionPoint:\t%d\n"
"\ttext[insertionpoint]:\t%s\n"
"\tGetLastPosition:\t%d\n"
"\tlen(text):\t\t%d\n"
% (ip, text[ip], lp, len(text)))
#---------------------------------------------------------------------------

213
wxPython/demo/wxTimeCtrl.py Normal file
View File

@@ -0,0 +1,213 @@
from wxPython.wx import *
from wxPython.lib.timectrl import *
#----------------------------------------------------------------------
class TestPanel( wxPanel ):
def __init__( self, parent, log ):
wxPanel.__init__( self, parent, -1 )
self.log = log
panel = wxPanel( self, -1 )
grid = wxFlexGridSizer( 0, 2, 20, 0 )
text1 = wxStaticText( panel, 10, "A 12-hour format wxTimeCtrl:")
self.time12 = wxTimeCtrl( panel, 20, name="12 hour control" )
spin1 = wxSpinButton( panel, 30, wxDefaultPosition, wxSize(-1,20), 0 )
self.time12.BindSpinButton( spin1 )
grid.AddWindow( text1, 0, wxALIGN_RIGHT, 5 )
hbox1 = wxBoxSizer( wxHORIZONTAL )
hbox1.AddWindow( self.time12, 0, wxALIGN_CENTRE, 5 )
hbox1.AddWindow( spin1, 0, wxALIGN_CENTRE, 5 )
grid.AddSizer( hbox1, 0, wxLEFT, 5 )
text2 = wxStaticText( panel, 40, "A 24-hour format wxTimeCtrl:")
self.time24 = wxTimeCtrl( panel, 50, fmt24hr=true, name="24 hour control" )
spin2 = wxSpinButton( panel, 60, wxDefaultPosition, wxSize(-1,20), 0 )
self.time24.BindSpinButton( spin2 )
grid.AddWindow( text2, 0, wxALIGN_RIGHT|wxTOP|wxBOTTOM, 5 )
hbox2 = wxBoxSizer( wxHORIZONTAL )
hbox2.AddWindow( self.time24, 0, wxALIGN_CENTRE, 5 )
hbox2.AddWindow( spin2, 0, wxALIGN_CENTRE, 5 )
grid.AddSizer( hbox2, 0, wxLEFT, 5 )
text3 = wxStaticText( panel, 70, "A wxTimeCtrl without a spin button:")
self.spinless_ctrl = wxTimeCtrl( panel, 80, name="spinless control" )
grid.AddWindow( text3, 0, wxALIGN_RIGHT|wxTOP|wxBOTTOM, 5 )
grid.AddWindow( self.spinless_ctrl, 0, wxLEFT, 5 )
buttonChange = wxButton( panel, 100, "Change Controls")
self.radio12to24 = wxRadioButton( panel, 110, "Copy 12-hour time to 24-hour control", wxDefaultPosition, wxDefaultSize, wxRB_GROUP )
self.radio24to12 = wxRadioButton( panel, 120, "Copy 24-hour time to 12-hour control")
self.radioWx = wxRadioButton( panel, 130, "Set controls to 'now' using wxDateTime")
self.radioMx = wxRadioButton( panel, 140, "Set controls to 'now' using mxDateTime")
radio_vbox = wxBoxSizer( wxVERTICAL )
radio_vbox.AddWindow( self.radio12to24, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 )
radio_vbox.AddWindow( self.radio24to12, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 )
radio_vbox.AddWindow( self.radioWx, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 )
radio_vbox.AddWindow( self.radioMx, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 )
box_label = wxStaticBox( panel, 90, "Change Controls through API" )
buttonbox = wxStaticBoxSizer( box_label, wxHORIZONTAL )
buttonbox.AddWindow( buttonChange, 0, wxALIGN_CENTRE|wxALL, 5 )
buttonbox.AddSizer( radio_vbox, 0, wxALIGN_CENTRE|wxALL, 5 )
outer_box = wxBoxSizer( wxVERTICAL )
outer_box.AddSizer( grid, 0, wxALIGN_CENTRE|wxBOTTOM, 20 )
outer_box.AddSizer( buttonbox, 0, wxALIGN_CENTRE|wxALL, 5 )
# Turn on mxDateTime option only if we can import the module:
try:
from mx import DateTime
except ImportError:
self.radioMx.Enable( false )
panel.SetAutoLayout( true )
panel.SetSizer( outer_box )
outer_box.Fit( panel )
panel.Move( (50,50) )
self.panel = panel
EVT_TIMEUPDATE( self, self.time12.GetId(), self.OnTimeChange )
EVT_TIMEUPDATE( self, self.time24.GetId(), self.OnTimeChange )
EVT_TIMEUPDATE( self, self.spinless_ctrl.GetId(), self.OnTimeChange )
EVT_BUTTON( self, buttonChange.GetId(), self.OnButtonClick )
def OnTimeChange( self, event ):
timectrl = self.panel.FindWindowById( event.GetId() )
self.log.write('%s time = %s\n' % ( timectrl.GetName(), timectrl.GetValue() ) )
def OnButtonClick( self, event ):
if self.radio12to24.GetValue():
self.time24.SetValue( self.time12.GetValue() )
elif self.radio24to12.GetValue():
self.time12.SetValue( self.time24.GetValue() )
elif self.radioWx.GetValue():
now = wxDateTime_Now()
self.time12.SetWxDateTime( now )
self.time24.SetWxDateTime( now )
self.spinless_ctrl.SetWxDateTime( now )
elif self.radioMx.GetValue():
from mx import DateTime
now = DateTime.now()
self.time12.SetMxDateTime( now )
self.time24.SetMxDateTime( now )
self.spinless_ctrl.SetMxDateTime( now )
#----------------------------------------------------------------------
def runTest( frame, nb, log ):
win = TestPanel( nb, log )
return win
#----------------------------------------------------------------------
overview = """<html><body>
<P>
<B>wxTimeCtrl</B> provides a multi-cell control that allows manipulation of a time
value. It supports 12 or 24 hour format, and you can use wxDateTime or mxDateTime
to get/set values from the control.
<P>
Left/right/tab keys to switch cells within a wxTimeCtrl, and the up/down arrows act
like a spin control. wxTimeCtrl also allows for an actual spin button to be attached
to the control, so that it acts like the up/down arrow keys.
<P>
The <B>!</B> or <B>c</B> key sets the value of the control to <B><I>now.</I></B>
<P>
Here's the API for wxTimeCtrl:
<DL><PRE>
<B>wxTimeCtrl</B>(
parent, id = -1,
<B>value</B> = '12:00:00 AM',
pos = wxDefaultPosition,
size = wxDefaultSize,
<B>fmt24hr</B> = false,
<B>spinButton</B> = None,
<B>style</B> = wxTE_PROCESS_TAB,
name = "time")
</PRE>
<UL>
<DT><B>value</B>
<DD>If no initial value is set, the default will be midnight; if an illegal string
is specified, a ValueError will result. (You can always later set the initial time
with SetValue() after instantiation of the control.)
<DL><B>size</B>
<DD>The size of the control will be automatically adjusted for 12/24 hour format
if wxDefaultSize is specified.
<BR>
<DT><B>fmt24hr</B>
<DD>If true, control will display time in 24 hour time format; if false, it will
use 12 hour AM/PM format. SetValue() will adjust values accordingly for the
control, based on the format specified.
<BR>
<DT><B>spinButton</B>
<DD>If specified, this button's events will be bound to the behavior of the
wxTimeCtrl, working like up/down cursor key events. (See BindSpinButton.)
<BR>
<DT><B>style</B>
<DD>By default, wxTimeCtrl will process TAB events, by allowing tab to the
different cells within the control.
</DL>
</UL>
<BR>
<BR>
<DT><B>SetValue(time_string)</B>
<DD>Sets the value of the control to a particular time, given a valid time string;
raises ValueError on invalid value
<BR>
<DT><B>GetValue()</B>
<DD>Retrieves the string value of the time from the control
<BR>
<DT><B>SetWxDateTime(wxDateTime)</B>
<DD>Uses the time portion of a wxDateTime to construct a value for the control.
<BR>
<DT><B>GetWxDateTime()</B>
<DD>Retrieves the value of the control, and applies it to the wxDateTimeFromHMS()
constructor, and returns the resulting value. (This returns the date portion as
"today".)
<BR>
<DT><B>SetMxDateTime(mxDateTime)</B>
<DD>Uses the time portion of an mxDateTime to construct a value for the control.
<EM>NOTE:</EM> This imports mx.DateTime at runtime only if this or the Get function
is called.
<BR>
<DT><B>GetMxDateTime()</B>
<DD>Retrieves the value of the control and applies it to the DateTime.Time()
constructor, and returns the resulting value. (mxDateTime is smart enough to
know this is just a time value.)
<BR>
<DT><B>BindSpinButton(wxSpinBtton)</B>
<DD>Binds an externally created spin button to the control, so that up/down spin
events change the active cell or selection in the control (in addition to the
up/down cursor keys.) (This is primarily to allow you to create a "standard"
interface to time controls, as seen in Windows.)
<BR>
<DT><B>EVT_TIMEUPDATE(win, id, func)</B>
<DD>func is fired whenever the value of the control changes.
</DL>
</body></html>
"""
if __name__ == '__main__':
import sys,os
import run
run.main(['', os.path.basename(sys.argv[0])])

View File

@@ -15,7 +15,7 @@ class TestToolBar(wxFrame):
wxWindow(self, -1).SetBackgroundColour(wxNamedColour("WHITE"))
tb = self.CreateToolBar(wxTB_HORIZONTAL|wxNO_BORDER|wxTB_FLAT)
tb = self.CreateToolBar(wxTB_HORIZONTAL|wxNO_BORDER|wxTB_FLAT|wxTB_TEXT)
# wxTB_VERTICAL
#tb = wxToolBarSimple(self, -1, wxDefaultPosition, wxDefaultSize,
# wxTB_HORIZONTAL | wxNO_BORDER | wxTB_FLAT)
@@ -23,7 +23,8 @@ class TestToolBar(wxFrame):
self.CreateStatusBar()
tb.AddSimpleTool(10, images.getNewBitmap(), "New", "Long help for 'New'")
#tb.AddSimpleTool(10, images.getNewBitmap(), "New", "Long help for 'New'")
tb.AddLabelTool(10, "New", images.getNewBitmap(), shortHelp="New", longHelp="Long help for 'New'")
EVT_TOOL(self, 10, self.OnToolClick)
EVT_TOOL_RCLICKED(self, 10, self.OnToolRClick)

View File

@@ -30,7 +30,9 @@ class TestTreeCtrlPanel(wxPanel):
tID = NewId()
self.tree = MyTreeCtrl(self, tID, wxDefaultPosition, wxDefaultSize,
wxTR_HAS_BUTTONS | wxTR_EDIT_LABELS# | wxTR_MULTIPLE
wxTR_HAS_BUTTONS
| wxTR_EDIT_LABELS
#| wxTR_MULTIPLE
#| wxTR_HIDE_ROOT
, self.log)
@@ -105,8 +107,20 @@ class TestTreeCtrlPanel(wxPanel):
if self.tree.GetItemText(event.GetItem()) == "The Root Item":
wxBell()
self.log.WriteText("You can't edit this one...\n")
# Lets just see what's visible of its children
cookie = 0
root = event.GetItem()
(child, cookie) = self.tree.GetFirstChild(root, cookie)
while child.IsOk():
self.log.WriteText("Child [%s] visible = %d" %
(self.tree.GetItemText(child),
self.tree.IsVisible(child)))
(child, cookie) = self.tree.GetNextChild(root, cookie)
event.Veto()
def OnEndEdit(self, event):
self.log.WriteText("OnEndEdit\n")
# show how to reject edit, we'll not allow any digits

View File

@@ -11,7 +11,7 @@ resourceText = r'''<?xml version="1.0"?>
<object class="MyBluePanel" name="MyPanel">
<size>200,100</size>
<object class="wxStaticText" name="lable1">
<object class="wxStaticText" name="lable1" subclass="wxPython.wx.wxPreStaticText">
<label>This blue panel is a class derived from wxPanel,\nand is loaded by a custom wxXmlResourceHandler.</label>
<pos>10,10</pos>
</object>