It's late, so the following is not on GitHub yet, but thought I'd share.
I did a major re-write of a few of the methods in the KJ_BibleApp.py program.
As the code materialized, I realized that there were things that could be made more efficient,
thus yet another version. But (from an old (1960's?) breakfast cereal ad) 'Mikey likes it'.
This now includes an 'info' entry in the page dictionary that allows events to have all of the
keys necessary to access any part of the bible dictionary for any given event. There is currently a lot
of verbose text being generated as the mouse is moved around, but that's what I want for now. I need to
get caught up on my sleep, and try to maintain a human day/night cycle (if possible).
so here's the new moving target!
KJ_BibleApp.py
I did a major re-write of a few of the methods in the KJ_BibleApp.py program.
As the code materialized, I realized that there were things that could be made more efficient,
thus yet another version. But (from an old (1960's?) breakfast cereal ad) 'Mikey likes it'.
This now includes an 'info' entry in the page dictionary that allows events to have all of the
keys necessary to access any part of the bible dictionary for any given event. There is currently a lot
of verbose text being generated as the mouse is moved around, but that's what I want for now. I need to
get caught up on my sleep, and try to maintain a human day/night cycle (if possible).
so here's the new moving target!
KJ_BibleApp.py
import BiblePaths import json import wx import codecs class KJ_BibleApp: def __init__(self, parent, id = wx.ID_ANY, title = "Bible for the Blind", xpos=20, ypos=20, width=1200, height=600, style=wx.DEFAULT_FRAME_STYLE): self.bpath = BiblePaths.BiblePaths() self.app = wx.App() self.frame = wx.Frame(None, id=wx.ID_ANY, title=title, pos=(xpos, ypos), size=(width, height), style=style) self.app.Bind(wx.EVT_CLOSE, self.OnClose) self.app.SetTopWindow(self.frame) with self.bpath.IndexedBible.open() as f: self.bible = json.load(f) self.ot = 'Old Testament' self.nt = 'New Testament' self.book_list = self.get_book_list() # dictionary to hold all notebook pages self.pages = {} # Button position and dimensions self.button_width = 110 self.button_height = 36 self.button_hover_color = '#87ceeb' self.button_normal_color = wx.NullColour self.left_x = 5 self.upper_left_y = 5 self.x_increment = 150 self.y_increment = 55 self.x_max = width self.create_application() self.frame.Show() self.app.MainLoop() def create_application(self): self.create_notebook() self.create_pages() def create_notebook(self): self.nb = wx.Notebook(self.frame, id=wx.ID_ANY, pos=wx.DefaultPosition, size=wx.DefaultSize, style=0, name=wx.NotebookNameStr) self.nb.Bind(wx.EVT_NOTEBOOK_PAGE_CHANGED, self.OnPageChanged) self.nb.Bind(wx.EVT_NOTEBOOK_PAGE_CHANGING, self.OnPageChanging) def set_page(self, event): self.nb.SetSelection(self.pages['Index']['panel']) event.skip() def add_page(self, title): self.pages[title] = {} self.pages[title]['panel'] = wx.Panel(self.nb, id=wx.ID_ANY, style=wx.CLIP_CHILDREN) self.nb.AddPage(self.pages[title]['panel'], text=title) return self.pages[title] def get_book_list(self): # Each entry is list[volume, book, chapters] # Chapters is the number of chapters book_list = [] for volume, value in self.bible.items(): for book, value1 in value.items(): chapters = 0 for chapter, unused in value1.items(): if chapter.isdigit(): chapters += 1 book_list.append([volume, book, chapters]) return book_list def new_button(self, button, panel, label_text, btn_name, xpos, ypos): button = wx.Button(panel, id=wx.ID_ANY, label=label_text, pos=(xpos, ypos), size=(self.button_width, self.button_height), name=btn_name) return button def new_xy(self, xpos, ypos): xpos += self.x_increment if xpos >= self.x_max: ypos += self.y_increment xpos = self.left_x return xpos, ypos def create_pages(self): xpos = self.left_x ypos = self.upper_left_y page = {} # / =============== Index page is special =============== page['Index'] = {} page['Index']['panel'] = wx.Panel(self.nb, id=wx.ID_ANY, style=wx.CLIP_CHILDREN) page['Index']['page'] = self.nb.AddPage(page['Index']['panel'], text='Index') # Index buttons for volume, book, unused in self.book_list: chapter = None label_text = book btn_name = book pageidx = page['Index'][book] = {} btn = pageidx['button'] = self.new_button(pageidx, page['Index']['panel'], label_text, btn_name, xpos, ypos) pinfo = pageidx['info'] = {} pinfo['volume'] = volume pinfo['book'] = book pinfo['chapter'] = None btn.name = [volume, book, chapter, page] # Add additional user info as pinfo['userinfo'] = value # where userinfo replaced by meaningful name btn.Bind(wx.EVT_ENTER_WINDOW, self.OnEnterWindow, btn) btn.Bind(wx.EVT_LEAVE_WINDOW, self.OnExitWindow, btn) btn.Bind(wx.EVT_BUTTON, self.OnClick, btn) xpos, ypos = self.new_xy(xpos, ypos) # =============== chapter pages =============== for volume, book, chapters in self.book_list: page[book] = {} page[book]['panel'] = wx.Panel(self.nb, id=wx.ID_ANY, style=wx.CLIP_CHILDREN) page[book]['page'] = self.nb.AddPage(page[book]['panel'], text=book) xpos = self.left_x ypos = self.upper_left_y for chapter in range(chapters): chapter += 1 label_text = f'{book}:{chapter}' pageidx = page[book][chapter] = {} btn = pageidx['button'] = self.new_button(pageidx, page[book]['panel'], label_text, btn_name, xpos, ypos) pinfo = pageidx['info'] = {} pinfo['volume'] = volume pinfo['book'] = book pinfo['chapter'] = chapter btn.name = [volume, book, chapter, page] # Add additional user info as pinfo['userinfo'] = value # where userinfo replaced by meaningful name btn.Bind(wx.EVT_ENTER_WINDOW, self.OnEnterWindow, btn) btn.Bind(wx.EVT_LEAVE_WINDOW, self.OnExitWindow, btn) btn.Bind(wx.EVT_BUTTON, self.OnClick, btn) xpos, ypos = self.new_xy(xpos, ypos) def OnEnterWindow(self, event): volume, book, chapter, page = event.GetEventObject().name print(f'volume: {volume}, book: {book}, chapter: {chapter}') #page['buttons'][name].SetBackgroundColour(self.button_hover_color) def OnExitWindow(self, event): volume, book, chapter, page = event.GetEventObject().name print(f'volume: {volume}, book: {book}, chapter: {chapter}') # page['buttons'][name].SetBackgroundColour(self.button_normal_color) def OnClick(self, event): volume, book, chapter, page = event.GetEventObject().name print(f'volume: {volume}, book: {book}, chapter: {chapter}') def get_mp3_filepath(self, volume, book, chapter): mp3path = self.bible[volume][book][chapter]['mp3path'] print(f'mp3path: {mp3path}') fullpath = self.bpath.KingJamesAudiopath / mp3path[0] / mp3path[1] return fullpath def OnPageChanged(self, event): pass def OnPageChanging(self, event): pass def OnClose(self): self.app.Destroy() if __name__ == '__main__': KJ_BibleApp(None, width=1200)