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