• 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).

  • 相关阅读:
    RabbitMQ死信队列另类用法之复合死信
    Asp.NetCore轻松学-使用Docker进行容器化托管
    Asp.NetCore轻松学-使用Supervisor进行托管部署
    Asp.NetCore轻松学-部署到 Linux 进行托管
    Asp.NetCore轻松学-部署到 IIS 进行托管
    一个提问引发的职业规划热议-拨开迷雾,走向光明
    Asp.Net Core 轻松学-使用MariaDB/MySql/PostgreSQL和支持多个上下文对象
    Asp.Net Core 轻松学-经常使用异步的你,可能需要看看这个文章
    Asp.Net Core 轻松学-10分钟使用EFCore连接MSSQL数据库
    Asp.Net Core 轻松学-多线程之Task(补充)
  • 原文地址:https://www.cnblogs.com/dengyigod/p/3094011.html
Copyright © 2020-2023  润新知