Tip of the Day Recipe

Tip of the Day Recipe

"Tip of the day" is easily implemented with the wxCreateFileTipProvider function and a text file full of tips.

Your application will need:

  • Some sort of persistence to remember whether tips are being shown and which tip will be shown next. For this recipe, I'm just referring to self.Persist, but I am not illustrating how self.Persist is created, saved, or restored.

You should also include:

  • A settings panel that allows the user to turn the tips on/off, or a menu option for showing a tip of the day. Otherwise, if the user turns the tips off, they will not be able to turn them back on again!

 

The Recipe

First, create a text file (tips.txt) with helpful tips in it. Lines that begin with a "#" will be treated as comments:

 

# Dental hygene tips:
Brush your teeth three times a day.
Floss every day.
An apple a day keeps the doctor away.

In your frame's intialization, create a tip provider:

 

切换行号显示
   1 self.TipOfTheDay = wx.CreateFileTipProvider("tips.txt", self.Persist.TipOfTheDayIndex)
   2 if self.Persist.ShowTotD:
   3     wx.CallAfter(self.ShowTipOfTheDay)

Note that I'm doing a wx.CallAfter so that the initialization process doesn't grind to a halt while waiting for the user to dismiss the tip.

The ShowTipOfTheDay function is:

 

切换行号显示
   1 def ShowTipOfTheDay(self):
   2     self.Persist.ShowTotD = wx.ShowTip(self, self.TipOfTheDay, self.Persist.ShowTotD)

Finally, when my application is shutting down, I recapture the current tip number so that the tips will pick up from where they left off on the next run.

 

切换行号显示
   1 self.Persist.TipOfTheDayIndex = self.TipOfTheDay.CurrentTip

That CurrentTip member doesn't appear to be documented in the help files, but it does seem to do the trick.

 


First example :

Here's a complete example of using :

native.png

Show__Tip_At_Startup.zip

 

切换行号显示
   1 import sys
   2 import os
   3 import wx
   4 
   5 app_dir = os.path.split(os.path.abspath(sys.argv[0]))[0]
   6 config_file = os.path.join(app_dir, "options.cfg")
   7 
   8 #-----------------------------------------------------
   9 
  10 class MyTipOption(wx.Dialog):
  11      def __init__(self, parent):
  12           wx.Dialog.__init__(self, parent, -1, title="Option tips")
  13 
  14           self.Bind(wx.EVT_CLOSE, self.on_close_window)
  15 
  16           #-------------------
  17 
  18           config = GetConfig()
  19           self.checkBox = wx.CheckBox(self, -1,
  20                                       label="Show tips at start up",
  21                                       pos=(20, 20))
  22           self.checkBox.SetValue(config.ReadInt("ShowTips", 0))
  23           content = self.checkBox.GetValue()
  24           print "CheckBox = %s" % content
  25 
  26           self.btnClose = wx.Button(self, -1,
  27                                     label="&Close",
  28                                     pos=(20, 120),
  29                                     size=(100, 30))
  30 
  31           self.checkBox.Bind(wx.EVT_CHECKBOX, self.on_check_box)
  32           self.Bind(wx.EVT_BUTTON, self.on_close_btn, self.btnClose)
  33 
  34           #-------------------
  35 
  36           self.CentreOnParent(wx.BOTH)
  37 
  38           #-------------------
  39 
  40           self.btnClose = self.ShowModal()
  41           self.Close()
  42 
  43      #------------------------
  44 
  45      def on_check_box(self, event):
  46           config = GetConfig()
  47           config.WriteInt("ShowTips", self.checkBox.GetValue())
  48           content = self.checkBox.GetValue()
  49           print "CheckBox = %s" % content
  50 
  51      def on_close_btn(self, event):
  52           self.Close(True)
  53 
  54      def on_close_window(self, event):
  55           self.Destroy()
  56 
  57 #-----------------------------------------------------
  58 
  59 class MyFrame(wx.Frame):
  60      def __init__(self, parent, id, title):
  61           wx.Frame.__init__(self, parent, -1, title)
  62 
  63           self.Bind(wx.EVT_CLOSE, self.on_close_window)
  64 
  65           #-------------------
  66 
  67           self.panel = wx.Panel(self, -1)
  68 
  69           self.btnTip = wx.Button(self.panel, -1,
  70                                   label="Show &tip setting dialog",
  71                                   pos=(20, 20),
  72                                   size=(230, 30))
  73           self.btnClose = wx.Button(self.panel, -1,
  74                                     label="&Quit",
  75                                     pos=(20, 100),
  76                                     size=(100, 30))
  77 
  78           self.Bind(wx.EVT_BUTTON, self.on_tip_btn, self.btnTip)
  79           self.Bind(wx.EVT_BUTTON, self.on_close_btn, self.btnClose)
  80 
  81           #-------------------
  82 
  83           # Simplified init method
  84           self.create_menu_bar()
  85 
  86           #-------------------
  87 
  88           self.CenterOnScreen()
  89 
  90      #------------------------
  91 
  92      def create_menu_bar(self):
  93           menuBar = wx.MenuBar()
  94 
  95           menuFile = wx.Menu(style=wx.MENU_TEAROFF)
  96           item = wx.MenuItem(menuFile, -1,
  97                              text="&Quit\tCtrl+Q",
  98                              help="Quit application.")
  99           menuFile.AppendItem(item)
 100           self.Bind(wx.EVT_MENU, self.on_close_btn, item)
 101 
 102           menuOption = wx.Menu(style=wx.MENU_TEAROFF)
 103           item = wx.MenuItem(menuOption, -1,
 104                              text="&Tip\tCtrl+K",
 105                              help="Show or hide tip at start up.")
 106           menuOption.AppendItem(item)
 107           self.Bind(wx.EVT_MENU, self.on_tip_btn, item)
 108 
 109           menuBar.Append(menuFile, title="&File")
 110           menuBar.Append(menuOption, title="&Option")
 111           self.SetMenuBar(menuBar)
 112 
 113      def show_tip(self):
 114           config = GetConfig()
 115 
 116           # Tip status (show or hide)
 117           showTip = config.ReadInt("ShowTips", 1)
 118           if showTip == 1 :
 119                print "Show tip = %s" % True
 120           elif showTip == 0 :
 121                print "Show tip = %s" % False
 122 
 123           index = config.ReadInt("TipIndex", 0)
 124           print "Index = %s" % index
 125 
 126 
 127           if showTip:
 128               tipProvider = wx.CreateFileTipProvider("tips.txt", index)
 129               showTip = wx.ShowTip(self, tipProvider)
 130               index = tipProvider.GetCurrentTip()
 131 
 132               config.WriteInt("ShowTips", showTip)
 133               config.WriteInt("TipIndex", index)
 134 
 135      def on_tip_btn(self, event):
 136           self.tip = MyTipOption(self)
 137 
 138      def on_close_btn(self, event):
 139           self.Close(True)
 140 
 141      def on_close_window(self, event):
 142           self.Destroy()
 143 
 144 #-----------------------------------------------------
 145 
 146 class App(wx.App):
 147      def OnInit(self):
 148           self.SetAppName("Test_Tip")
 149 
 150           frame = MyFrame(None, -1, "Test show tip at start up")
 151           frame.Show(True)
 152           self.SetTopWindow(frame)
 153 
 154           if os.path.exists("tips.txt"):
 155               wx.CallAfter(frame.show_tip)
 156 
 157           return True
 158 
 159 #-----------------------------------------------------
 160 
 161 def GetConfig():
 162      config = wx.FileConfig(appName="Test_Tip",
 163                             localFilename=config_file)
 164      return config
 165 
 166 #-----------------------------------------------------
 167 
 168 if __name__ == "__main__":
 169      app = App(False)
 170      app.MainLoop()

For the no-ascii characters, save the text file with an utf-8 encoding.

 


Second example :

A) - How change the widget's text.

B) - Support of internationalization (i18n) :

modified.png i18n.png

Show__Tip_At_Startup__i18n.zip

 

切换行号显示
   1 import sys
   2 import os
   3 import wx
   4 
   5 app_dir = os.path.split(os.path.abspath(sys.argv[0]))[0]
   6 config_file = os.path.join(app_dir, "options.cfg")
   7 
   8 # Define a translation string
   9 _ = wx.GetTranslation
  10 
  11 #-----------------------------------------------------
  12 
  13 class MyTipOption(wx.Dialog):
  14      def __init__(self, parent):
  15           wx.Dialog.__init__(self, parent, -1, title=_("Option"))
  16 
  17           self.Bind(wx.EVT_CLOSE, self.on_close_window)
  18 
  19           #-------------------
  20 
  21           config = GetConfig()
  22           self.checkBox = wx.CheckBox(self, -1,
  23                                       label=_("Show tips at start up"),
  24                                       pos=(20, 20))
  25           self.checkBox.SetValue(config.ReadInt("ShowTips", 0))
  26           content = self.checkBox.GetValue()
  27           print "CheckBox = %s" % content
  28 
  29           self.text = wx.StaticText(self, -1,
  30                                     label=_("Language :"),
  31                                     pos=(20, 68))
  32 
  33           self.language = wx.Choice(self, -1,
  34                                     choices=[_("English"),
  35                                              _("French")],
  36                                     pos=(100, 65),
  37                                     size=(100, -1))
  38 
  39           self.btnClose = wx.Button(self, -1,
  40                                     label=_("&Close"),
  41                                     pos=(20, 120),
  42                                     size=(100, 30))
  43 
  44           self.checkBox.Bind(wx.EVT_CHECKBOX, self.on_check_box)
  45           self.Bind(wx.EVT_CHOICE, self.on_language)
  46           self.Bind(wx.EVT_BUTTON, self.on_close_btn, self.btnClose)
  47 
  48           #-------------------
  49 
  50           self.CentreOnParent(wx.BOTH)
  51 
  52           #-------------------
  53 
  54           self.btnClose = self.ShowModal()
  55           self.Close()
  56 
  57      #------------------------
  58 
  59      def on_language(self, event):
  60           choice = self.language.GetSelection()
  61 
  62           config = GetConfig()
  63           if choice == 0:
  64                val = "LANGUAGE_ENGLISH"
  65           else:
  66                val = "LANGUAGE_FRENCH"
  67           config.Write("Language", val)
  68 
  69      def on_check_box(self, event):
  70           config = GetConfig()
  71           config.WriteInt("ShowTips", self.checkBox.GetValue())
  72           content = self.checkBox.GetValue()
  73           print "CheckBox = %s" % content
  74 
  75      def on_close_btn(self, event):
  76           self.Close(True)
  77 
  78      def on_close_window(self, event):
  79           self.Destroy()
  80 
  81 #-----------------------------------------------------
  82 
  83 class MyFrame(wx.Frame):
  84      def __init__(self, parent, id, title):
  85           wx.Frame.__init__(self, parent, -1, title)
  86 
  87           self.Bind(wx.EVT_CLOSE, self.on_close_window)
  88 
  89           #-------------------
  90 
  91           self.panel = wx.Panel(self, -1)
  92 
  93           self.btnTip = wx.Button(self.panel, -1,
  94                                   label=_("Show &tip setting dialog"),
  95                                   pos=(20, 20),
  96                                   size=(230, 30))
  97           self.btnClose = wx.Button(self.panel, -1,
  98                                     label=_("&Quit"),
  99                                     pos=(20, 100),
 100                                     size=(100, 30))
 101 
 102           self.Bind(wx.EVT_BUTTON, self.on_tip_btn, self.btnTip)
 103           self.Bind(wx.EVT_BUTTON, self.on_close_btn, self.btnClose)
 104 
 105           #-------------------
 106 
 107           # Simplified init method
 108           self.create_menu_bar()
 109 
 110           #-------------------
 111 
 112           self.CenterOnScreen()
 113 
 114      #------------------------
 115 
 116      def create_menu_bar(self):
 117           menuBar = wx.MenuBar()
 118 
 119           menuFile = wx.Menu(style=wx.MENU_TEAROFF)
 120           item = wx.MenuItem(menuFile, -1,
 121                              text=_("&Quit\tCtrl+Q"),
 122                              help=_("Quit application."))
 123           menuFile.AppendItem(item)
 124           self.Bind(wx.EVT_MENU, self.on_close_btn, item)
 125 
 126           menuOption = wx.Menu(style=wx.MENU_TEAROFF)
 127           item = wx.MenuItem(menuOption, -1,
 128                              text=_("&Setting\tCtrl+K"),
 129                              help=_("Setting language and tip."))
 130           menuOption.AppendItem(item)
 131           self.Bind(wx.EVT_MENU, self.on_tip_btn, item)
 132 
 133           menuBar.Append(menuFile, title=_("&File"))
 134           menuBar.Append(menuOption, title=_("&Option"))
 135           self.SetMenuBar(menuBar)
 136 
 137      def show_tip(self):
 138           config = GetConfig()
 139 
 140           # Tip status (show or hide)
 141           showTip = config.ReadInt("ShowTips", 1)
 142           if showTip == 1 :
 143                print "Show tip = %s" % True
 144           elif showTip == 0 :
 145                print "Show tip = %s" % False
 146 
 147           index = config.ReadInt("TipIndex", 0)
 148           print "Index = %s" % index
 149 
 150           if showTip:
 151               tipProvider = wx.CreateFileTipProvider("tips.txt", index)
 152               showTip = wx.ShowTip(self, tipProvider)
 153               index = tipProvider.GetCurrentTip()
 154 
 155               config.WriteInt("ShowTips", showTip)
 156               config.WriteInt("TipIndex", index)
 157 
 158      def on_tip_btn(self, event):
 159           self.tip = MyTipOption(self)
 160 
 161      def on_close_btn(self, event):
 162           self.Close(True)
 163 
 164      def on_close_window(self, event):
 165           self.Destroy()
 166 
 167 #-----------------------------------------------------
 168 
 169 class App(wx.App):
 170      def OnInit(self):
 171           self.SetAppName("Test_Tip_i18n")
 172 
 173           # Retrieve the user configuration language
 174           config = GetConfig()
 175           language = config.Read("Language", "LANGUAGE_DEFAULT")
 176 
 177           # Setup the locale
 178           self.locale = wx.Locale(getattr(wx, language))
 179           path = os.path.abspath("./locale") + os.path.sep
 180           self.locale.AddCatalogLookupPathPrefix(path)
 181           self.locale.AddCatalog(self.GetAppName())
 182 
 183           frame = MyFrame(None, -1, _("Test show tip at start up - i18n"))
 184           frame.Show(True)
 185           self.SetTopWindow(frame)
 186 
 187           if os.path.exists("tips.txt"):
 188               wx.CallAfter(frame.show_tip)
 189 
 190           return True
 191 
 192 #-----------------------------------------------------
 193 
 194 def GetConfig():
 195      config = wx.FileConfig(appName="Test_Tip_i18n",
 196                             localFilename=config_file)
 197      return config
 198 
 199 #-----------------------------------------------------
 200 
 201 if __name__ == "__main__":
 202      app = App(False)
 203      app.MainLoop()

For the non-ascii characters, save the text file with an utf-8 encoding.

Download attachments for the test (see below).

原文地址:https://www.cnblogs.com/dengyigod/p/3094011.html