Python Forum
moving from tkinter to wxpython - Printable Version

+- Python Forum (https://python-forum.io)
+-- Forum: Python Coding (https://python-forum.io/forum-7.html)
+--- Forum: Web Scraping & Web Development (https://python-forum.io/forum-13.html)
+--- Thread: moving from tkinter to wxpython (/thread-8405.html)

Pages: 1 2 3 4 5 6 7 8 9 10


RE: moving from tkinter to wxpython - sparkz_alot - Mar-14-2018

In Python < 3.6 (such as your 3.5)
This (3.6)
print(f"Mp3 file for Leviticus is here: {self.BibleIndex['Old Testament']['Leviticus']['mp3']}")
Is equivalent to this (<3.6)
print("Mp3 file for Leviticus is here: {}".format(self.BibleIndex['Old Testament']['Leviticus']['mp3']))
As Larz points out, in either case each instance of the curly brace represents a variable.


RE: moving from tkinter to wxpython - Barrowman - Mar-14-2018

Yes that would be great. I just code using gedit. Sorry about your Linux box. I had a disaster with mine about 6 weeks ago.
I was setting up a Raspberry Pi SD card from a backup iso I had. I always have used dd to do that since I got my first Raspberry Pi. I have had 10 so far. That time instead of writing to the SD card I stupidly wrote 4 Gig to the start of my H.D. I usually run a backup of my /home which is on a separate partition each week and had actually left it doing one to my NAS during the night before. So it was easy enough to restore everything.

As for pip its odd. If I ran pip it would install to python 2.7 as that is symlinked to python.
For python 3.5 it's symlinked to python3 so I have to use pip3 for that so it installs it into python 3.5. Now I have python 3.6.4 it's symlinked to python3.6 so I use pip3.6. That is what is currently failing to work.

(Mar-14-2018, 02:07 PM)sparkz_alot Wrote: In Python < 3.6 (such as your 3.5)
This (3.6)
print(f"Mp3 file for Leviticus is here: {self.BibleIndex['Old Testament']['Leviticus']['mp3']}")
Is equivalent to this (<3.6)
print("Mp3 file for Leviticus is here: {}".format(self.BibleIndex['Old Testament']['Leviticus']['mp3']))
As Larz points out, in either case each instance of the curly brace represents a variable.

Right now I can see how it works. Thanks.


RE: moving from tkinter to wxpython - Larz60+ - Mar-14-2018

I do have Linux memory sticks, but their slow.
You got it on the code.
I used Linux Mint for quite a while, but it just died on me twice, so I switched to openSuse
and ran with that for several years.
there two things you can do to get correct pip
1st try pip3 install wxpython
if that fails, find your Python3.6 package, pip should be in the Scripts directory use full path to make sure you are running the right version.

Then there's another possible solution:
The reason I asked which IDE you used is that PyCharm, which I use has a very simple package installation manager, which to date (on windows, not sure if it has the same performance on Linux) has not failed me.
To use, you simply click on settings (on the file menu), go to your project Interpreter page, click on the plus sign next to the currently installed packages, and select wxpython. It will make sure that the proper version is installed based on the Interpreter version assigned to the project. It has a sweet interface for creating virtual environment and cloning, pulling and pushing GitHub packages.

I know it's runs on Ubuntu, not sure about mint. Since they have both a commercial and community edition, mint may not support it.


RE: moving from tkinter to wxpython - Larz60+ - Mar-15-2018

I wanted to answer your installation post here.
I'm afraid if answer the actual post then no one else will respond,
but have you tried:
sudo apt-get install wxpython 
also, see this:https://stackoverflow.com/questions/42816555/trying-to-install-wxpython-phoenix-for-python-3
which may or may not be of help

or google grop: https://groups.google.com/forum/#!forum/wxpython-users


RE: moving from tkinter to wxpython - Larz60+ - Mar-16-2018

Update:

The past few days have been spent testing every process from start to finish, a
painful but necessary step in creating all as a package.

The Github repository has been completely redone, so re-install is necessary. See
below.

The complete GUI shell is working, but is still jsut a shell, without the final steps
needed to display text and play audio files, but all that functionality is in palce
and will be the next few days task.

Git Instructions (skip if git already installed)

for Linux:
1. Make sure you have Git Installed:
sudo apt-get update
        sudo apt-get upgrade
        sudo apt-get install git

If you are running red hat linux, replace above with:
sudo yum upgrade
        sudo yum install git

2. Clone application:
change directory to place where you want to install software (This will be automatic after package complete)
git clone https://github.com/Larz60p/Barrowman

For OSx:
  • Open a terminal window.
  • 1. Install Homebrew
  • Homebrew […] simplifies the installation of software on the Mac OS X operating system.
  • Homebrew – Wikipedia
  • Copy & paste the following into the terminal window and hit Return.
    ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
    brew doctor
  • You will be offered to install the Command Line Developer Tools from Apple. Confirm by clicking Install.
    After the installation finished, continue installing Homebrew by hitting Return again.
  • Install Git: Copy & paste the following into the terminal window and hit Return.
    brew install git

for windows:
1. Make sure you have Git Installed:
download git here: https://gitforwindows.org/
Install package

Output:
Requirements For all Operating Systems: Install the following packages: python 3.6 requests lxml wxpython BeautifulSoup4
=====================================================================================
Get the package:
  • Open camder (or other terminal window)
  • Clone the application
    git clone https://github.com/Larz60p/Barrowman
  • Run initialization program once (Only once... Requires internet access) This will take a while
        cd Barrowman/src
        python RunMeOnce.py
  • Run application shell only at this point, main GUI display and Notebook pages only.
    From Barrowman/src:
    python KJ_BibleApp.py
Data directory is created and loaded during ReaddMeOnce .py
This program should not be run more than once, but if it is done by mistake, allow it to complete.
It checks progress and will pick up where it left off.

The Data structure is:
Output:
Barrowman/src/data/ KingJames/ All text here audio/ chapter directories/ mp3 files by chapter html/ html file cache json/ IndexedBible.json - Bible dictionary. To get a viewable text version, run the following command: cat IndexedBible.json | python -m json.tool > IndexedBible.txt Various Xref files used for processing tmp/ temp files



RE: moving from tkinter to wxpython - Barrowman - Mar-16-2018

Sorry been out all day. Just tried this.
 python3.6 RunMeOnce.py 
Traceback (most recent call last):
  File "RunMeOnce.py", line 2, in <module>
    import CreateChapterJson
  File "/home/norman/experiment/Barrowman/src/CreateChapterJson.py", line 6, in <module>
    import GetUrl
  File "/home/norman/experiment/Barrowman/src/GetUrl.py", line 20, in <module>
    import requests
ModuleNotFoundError: No module named 'requests'  



RE: moving from tkinter to wxpython - Larz60+ - Mar-16-2018

Readme.md shows all of the packages that are required to run.
since you have a new python 3.6, they won't be available
here's a copy:
Output:
King James Audio Bible for the Blind Initial setup: Install following packages: requests lxml wxpython BeautifulSoup4 To Initialize program, download audio, and bible text: execute from command prompt (Internet access required): python RunMeOnce.py to run application from command prompt (only after one time initialization (above)): python KJ_BibleApp.py With many thanks to: Chapter titles downloaded from The Austin Bible Church: https://austinbiblechurch.com/sites/default/files/documents/oyttb/Bible_Chapter_Titles.pdf King James Bible text downloaded from from ebible.orr: http://ebible.org/kjv/kjvtxt.zip Audio Files from The King James Bible in mp3 audio downloaded from: main site: http://www.mp3bible.ca zip files: http://www.mp3bible.ca/zip/
I'll edit the install post above to include these.

FYI Just about finished with page dictionary modifications to include all
indexes necessary to access various levels of main bible dictionary. With this,
any button press on any notebook page will have immediate access (at the event level)
to any and all keys (that are pertinent to that level).


RE: moving from tkinter to wxpython - Larz60+ - Mar-17-2018

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)



RE: moving from tkinter to wxpython - Larz60+ - Mar-19-2018

There are some issues with setting proper tab in last posts code. Working on it, quitting for night to watch a movie with my
wife.


RE: moving from tkinter to wxpython - Larz60+ - Mar-20-2018

Issues have been fixed.
I created a completely new GitHub repository, named barrowman1.
Will merge later, for now, clone from new one.