+# 12/20/2003 - Jeff Grimmett (grimmtooth@softhome.net)
+#
+# o wxPyInformationalMessagesFrame -> PyInformationalMessagesFrame
+# o dummy_wxPyInformationalMessagesFrame -> dummy_PyInformationalMessagesFrame
+#
+
"""
infoframe.py
Released under wxWindows license etc.
itself a subclass of wxWindow: when the window is open (and ONLY
then), it's "frame" attribute is the actual instance of wFrame...
-Typical usage:
+Typical usage::
+
from wxPython.lib.infoframe import *
... # ... modify your wxApp as follows:
class myApp(wxApp):
- outputWindowClass = wxPyInformationalMessagesFrame
+ outputWindowClass = PyInformationalMessagesFrame
...
+
If you're running on Linux, you'll also have to supply an argument 1 to your
constructor of myApp to redirect stdout/stderr to this window (it's done
automatically for you on Windows).
If you don't want to redirect stdout/stderr, but use the class directly: do
-it this way:
+it this way::
- InformationalMessagesFrame = wxPyInformationalMessagesFrame\
+ InformationalMessagesFrame = PyInformationalMessagesFrame\
([options from progname (default ""),
- txt (default "informational
- messages"])
+ txt (default "informational messages"])
+
#^^^^ early in the program
...
InformationalMessagesFrame([comma-separated list of items to
All (well, most) of this is made clear by the example code at the end
of this file, which is run if the file is run by itself; otherwise,
see the appropriate "stub" file in the wxPython demo.
-
+
"""
-from wxPython.wx import *
-import sys, tempfile, os
+import os
+import sys
+import tempfile
-class _MyStatusBar(wxStatusBar):
- def __init__(self, parent,callbacks=None,useopenbutton=0):
- wxStatusBar.__init__(self, parent, -1, style=wxTAB_TRAVERSAL)
+import wx
+
+class _MyStatusBar(wx.StatusBar):
+ def __init__(self, parent, callbacks=None, useopenbutton=0):
+ wx.StatusBar.__init__(self, parent, -1, style=wx.TAB_TRAVERSAL)
self.SetFieldsCount(3)
self.SetStatusText("",0)
- ID = wxNewId()
- self.button1 = wxButton(self,ID,"Dismiss",
- style=wxTAB_TRAVERSAL)
- EVT_BUTTON(self,ID,self.OnButton1)
+ self.button1 = wx.Button(self, -1, "Dismiss", style=wx.TAB_TRAVERSAL)
+ self.Bind(wx.EVT_BUTTON, self.OnButton1, self.button1)
- ID = wxNewId()
if not useopenbutton:
- self.button2 = wxButton(self,ID,"Close File",
- style=wxTAB_TRAVERSAL)
+ self.button2 = wx.Button(self, -1, "Close File", style=wx.TAB_TRAVERSAL)
else:
- self.button2 = wxButton(self,ID,"Open New File",
- style=wxTAB_TRAVERSAL)
- EVT_BUTTON(self,ID,self.OnButton2)
+ self.button2 = wx.Button(self, -1, "Open New File", style=wx.TAB_TRAVERSAL)
+
+ self.Bind(wx.EVT_BUTTON, self.OnButton2, self.button2)
self.useopenbutton = useopenbutton
self.callbacks = callbacks
# figure out how tall to make the status bar
- dc = wxClientDC(self)
+ dc = wx.ClientDC(self)
dc.SetFont(self.GetFont())
(w,h) = dc.GetTextExtent('X')
h = int(h * 1.8)
- self.SetSize(wxSize(100, h))
+ self.SetSize((100, h))
self.OnSize("dummy")
- EVT_SIZE(self,self.OnSize)
+ self.Bind(wx.EVT_SIZE, self.OnSize)
# reposition things...
def OnSize(self, event):
self.CalculateSizes()
rect = self.GetFieldRect(1)
- self.button1.SetPosition(wxPoint(rect.x+5, rect.y+2))
- self.button1.SetSize(wxSize(rect.width-10, rect.height-4))
+ self.button1.SetPosition((rect.x+5, rect.y+2))
+ self.button1.SetSize((rect.width-10, rect.height-4))
rect = self.GetFieldRect(2)
- self.button2.SetPosition(wxPoint(rect.x+5, rect.y+2))
- self.button2.SetSize(wxSize(rect.width-10, rect.height-4))
+ self.button2.SetPosition((rect.x+5, rect.y+2))
+ self.button2.SetSize((rect.width-10, rect.height-4))
# widths........
def CalculateSizes(self):
- dc = wxClientDC(self.button1)
+ dc = wx.ClientDC(self.button1)
dc.SetFont(self.button1.GetFont())
(w1,h) = dc.GetTextExtent(self.button1.GetLabel())
- dc = wxClientDC(self.button2)
+ dc = wx.ClientDC(self.button2)
dc.SetFont(self.button2.GetFont())
(w2,h) = dc.GetTextExtent(self.button2.GetLabel())
self.button2.SetLabel ("Close File")
elif self.callbacks[1] ():
self.button2.SetLabel ("Open New File")
+
self.useopenbutton = 1 - self.useopenbutton
self.OnSize("")
self.button2.Refresh(True)
-class wxPyInformationalMessagesFrame:
+class PyInformationalMessagesFrame:
def __init__(self,
progname="",
text="informational messages",
self.title = "%s %s" % (progname,text)
self.parent = None # use the SetParent method if desired...
self.softspace = 1 # of rather limited use
+
if dir:
self.SetOutputDirectory(dir)
f = None
- def write(self,string):
- if not wxThread_IsMain():
+ def write(self, string):
+ if not wx.Thread_IsMain():
# Aquire the GUI mutex before making GUI calls. Mutex is released
# when locker is deleted at the end of this function.
- locker = wxMutexGuiLocker()
+ #
+ # TODO: This should be updated to use wx.CallAfter similarly to how
+ # PyOnDemandOutputWindow.write was so it is not necessary
+ # to get the gui mutex
+ locker = wx.MutexGuiLocker()
if self.Enabled:
if self.f:
move = 0
if not self.frame:
- self.frame = wxFrame(self.parent, -1, self.title, size=(450, 300),
- style=wxDEFAULT_FRAME_STYLE|wxNO_FULL_REPAINT_ON_RESIZE)
- self.text = wxTextCtrl(self.frame, -1, "",
- style = wxTE_MULTILINE|wxTE_READONLY|wxTE_RICH)
+ self.frame = wx.Frame(self.parent, -1, self.title, size=(450, 300),
+ style=wx.DEFAULT_FRAME_STYLE|wx.NO_FULL_REPAINT_ON_RESIZE)
+
+ self.text = wx.TextCtrl(self.frame, -1, "",
+ style = wx.TE_MULTILINE|wx.TE_READONLY|wx.TE_RICH)
self.frame.sb = _MyStatusBar(self.frame,
callbacks=[self.DisableOutput,
"nofile"))
self.frame.SetStatusBar(self.frame.sb)
self.frame.Show(True)
- EVT_CLOSE(self.frame, self.OnCloseWindow)
+ self.frame.Bind(wx.EVT_CLOSE, self.OnCloseWindow)
if hasattr(self,"nofile"):
self.text.AppendText(
else:
tempfile.tempdir = self.dir
filename = os.path.abspath(tempfile.mktemp ())
+
self.text.AppendText(
"Please close this window (or select the "
"'Dismiss' button below) when desired. By "
def OpenNewFile(self):
self.CloseFile()
- dlg = wxFileDialog(self.frame,
+ dlg = wx.FileDialog(self.frame,
"Choose a new log file", self.dir,"","*",
- wxSAVE | wxHIDE_READONLY | wxOVERWRITE_PROMPT)
- if dlg.ShowModal() == wxID_CANCEL:
+ wx.SAVE | wx.OVERWRITE_PROMPT)
+ if dlg.ShowModal() == wx.ID_CANCEL:
dlg.Destroy()
return 0
else:
def flush(self):
if self.text:
self.text.SetInsertionPointEnd()
- wxYield()
+ wx.Yield()
def __call__(self,* args):
-class Dummy_wxPyInformationalMessagesFrame:
+class Dummy_PyInformationalMessagesFrame:
def __init__(self,progname=""):
self.softspace = 1
def __call__(self,*args):