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