Search code examples
pythonuser-interfacewxpythonwxwidgets

Trying to do a text file viewer


I'm trying to build a minimalist text file editor using Python and wxWidgets.

It's the first time I'm building a graphical user interface.

I want to build a simple window that, on start, will open and display the content on the file 1.txt.

When clicking on the “Next” button, the editor should display the content of the 2.txt file.

I've made the following program, which successfully diplay the window and widgets I want, but can't manage to open text files and diplay them propely.

The problematic lines has been commented out, and I've used a print() to display the content of the oppenned file. Not only print() display an empty string, but the event of clicking the button doesn't seems to be taken into account.

Here is my code:

#!/usr/bin/env python3

import wx
import wx.lib.editor as editor


class Editor(wx.App):
    filecounter = 1

    def __init__(self):
        wx.App.__init__(self, redirect=False)

    def OnInit(self):
        frame = wx.Frame(
            None,
            -1,
            "blabla",
            size=(200, 100),
            style=wx.DEFAULT_FRAME_STYLE,
            name="wsfacile editor",
        )
        frame.Show(True)
        frame.Bind(wx.EVT_CLOSE, self.OnCloseFrame)

        win = self.EditWindow(frame)

        if win:
            frame.SetSize((800, 600))
            win.SetFocus()
            self.window = win
            frect = frame.GetRect()
        else:
            frame.Destroy()
            return True
        self.SetTopWindow(frame)
        self.frame = frame

        return True

    def OnExitApp(self, evt):
        self.frame.Close(True)

    def OnCloseFrame(self, evt):
        evt.Skip()

    def GetNextFile(self):
        self.filecounter += 1
        # self.ed.SetText(self.GetFileText(str(self.filecounter) + ".txt"))
        print(self.GetFileText(str(self.filecounter) + ".txt"))

    def GetFileText(self, filename):
        with open(filename, "r") as myfile:
            result = myfile.readlines()
            myfile.close()
        return result

    def EditWindow(self, frame):
        win = wx.Panel(frame, -1)
        self.ed = editor.Editor(win, -1, style=wx.SUNKEN_BORDER)
        next_button = wx.Button(win, 0, "Next")
        box = wx.BoxSizer(wx.VERTICAL)
        box.Add(self.ed, 1, wx.ALL | wx.GROW, 1)
        box.Add(next_button, 0, wx.ALIGN_CENTER, 0)
        self.Bind(wx.EVT_BUTTON, self.GetNextFile())
        win.SetSizer(box)
        win.SetAutoLayout(True)
        # self.ed.SetText(self.GetFileText(str(self.filecounter) + ".txt"))
        return win


def main():
    app = Editor()
    app.MainLoop()


if __name__ == "__main__":
    main()

Best regards


Solution

  • The line

            self.Bind(wx.EVT_BUTTON, self.GetNextFile())
    

    is wrong, it calls the function instead of setting it up as handler. You should remove the ().