class MyFrame(wx.Frame): def __init__(self, *args, **kwds): kwds["style"] = wx.DEFAULT_FRAME_STYLE wx.Frame.__init__(self, *args, **kwds) self.menubar = wx.MenuBar() self.menu_file = wx.Menu() self.menu_new = wx.MenuItem(self.menu_file, 101, "&New", "", wx.ITEM_NORMAL) self.menu_file.AppendItem(self.menu_new) self.menu_open = wx.MenuItem(self.menu_file, 102, "&Open", "", wx.ITEM_NORMAL) self.menu_file.AppendItem(self.menu_open) self.menu_save = wx.MenuItem(self.menu_file, 103, "&Save", "", wx.ITEM_NORMAL) self.menu_file.AppendItem(self.menu_save) self.menu_saveas = wx.MenuItem(self.menu_file, 104, "Save &As", "", wx.ITEM_NORMAL) self.menu_file.AppendItem(self.menu_saveas) self.menu_file.AppendSeparator() self.menu_close = wx.MenuItem(self.menu_file, 105, "&Close", "", wx.ITEM_NORMAL) self.menu_file.AppendItem(self.menu_close) self.menubar.Append(self.menu_file, "&File") self.menu_about = wx.Menu() self.menu_about_pysaved = wx.MenuItem(self.menu_about, 201, "&About PySaved", "", wx.ITEM_NORMAL) self.menu_about.AppendItem(self.menu_about_pysaved) self.menubar.Append(self.menu_about, "&About") self.SetMenuBar(self.menubar) self.nb = wx.Notebook(self, wx.ID_ANY, style=0) self.nb_panel_1 = wx.Panel(self.nb, wx.ID_ANY) self.label_name = wx.StaticText(self.nb_panel_1, wx.ID_ANY, "Name:") self.input_name = wx.TextCtrl(self.nb_panel_1, wx.ID_ANY, "") self.label_icon = wx.StaticText(self.nb_panel_1, wx.ID_ANY, "Icon (Windows only):") self.input_icon = wx.TextCtrl(self.nb_panel_1, wx.ID_ANY, "") self.button_search_icon = wx.BitmapButton(self.nb_panel_1, wx.ID_ANY, statics.search(), style=wx.NO_BORDER) self.label_execfile = wx.StaticText(self.nb_panel_1, wx.ID_ANY, "Executable file:") self.input_execfile = wx.TextCtrl(self.nb_panel_1, wx.ID_ANY, "") self.button_search_execfile = wx.BitmapButton(self.nb_panel_1, wx.ID_ANY, statics.search(), style=wx.NO_BORDER) self.radiobox_console = wx.RadioBox(self.nb_panel_1, wx.ID_ANY, "Console (Windows only)", choices=["show", "hide"], majorDimension=0, style=wx.RA_SPECIFY_COLS) self.sl1 = wx.StaticLine(self.nb_panel_1, wx.ID_ANY) self.label_pathstosearchin = wx.StaticText(self.nb_panel_1, wx.ID_ANY, "Paths to search in:") self.list_pathstosearchin = wx.ListBox(self.nb_panel_1, wx.ID_ANY, choices=[]) self.button_pathstosearchin_add = wx.BitmapButton(self.nb_panel_1, wx.ID_ANY, statics.add(), style=wx.NO_BORDER) self.button_pathstosearchin_edit = wx.BitmapButton(self.nb_panel_1, wx.ID_ANY, statics.edit(), style=wx.NO_BORDER) self.button_pathstosearchin_del = wx.BitmapButton(self.nb_panel_1, wx.ID_ANY, statics.dele(), style=wx.NO_BORDER) self.label_hiddenmodules = wx.StaticText(self.nb_panel_1, wx.ID_ANY, "Hidden modules:") self.list_hiddenmodules = wx.CheckListBox(self.nb_panel_1, wx.ID_ANY, choices=[]) self.nb_pane_2 = wx.Panel(self.nb, wx.ID_ANY) self.label_outpath = wx.StaticText(self.nb_pane_2, wx.ID_ANY, "Output path:") self.input_outpath = wx.TextCtrl(self.nb_pane_2, wx.ID_ANY, "") self.search_outpath = wx.BitmapButton(self.nb_pane_2, wx.ID_ANY, statics.search(), style=wx.NO_BORDER) self.label_temppath = wx.StaticText(self.nb_pane_2, wx.ID_ANY, "Temporary path:") self.input_temppath = wx.TextCtrl(self.nb_pane_2, wx.ID_ANY, "") self.search_temppath = wx.BitmapButton(self.nb_pane_2, wx.ID_ANY, statics.search(), style=wx.NO_BORDER) self.sl2 = wx.StaticLine(self.nb_pane_2, wx.ID_ANY) self.radiobox_saveas = wx.RadioBox(self.nb_pane_2, wx.ID_ANY, "Save as", choices=["multiple files in one folder", "one file"], majorDimension=0, style=wx.RA_SPECIFY_COLS) self.checkbox_debug = wx.CheckBox(self.nb_pane_2, wx.ID_ANY, "Debug-mode") self.checkbox_unicode = wx.CheckBox(self.nb_pane_2, wx.ID_ANY, "Support unicode") self.sl3 = wx.StaticLine(self.nb_pane_2, wx.ID_ANY) self.bitmap_start = wx.BitmapButton(self.nb_pane_2, wx.ID_ANY, statics.start(), style=wx.NO_BORDER) self.sl4 = wx.StaticLine(self.nb_pane_2, wx.ID_ANY) self.label_log = wx.StaticText(self.nb_pane_2, wx.ID_ANY, "Log:") self.list_log = wx.ListBox(self.nb_pane_2, wx.ID_ANY, choices=[]) self.Bind(wx.EVT_MENU, self.new, self.menu_new) self.Bind(wx.EVT_MENU, self.open, self.menu_open) self.Bind(wx.EVT_MENU, self.save, self.menu_save) self.Bind(wx.EVT_MENU, self.saveas, self.menu_saveas) self.Bind(wx.EVT_MENU, self.exit, self.menu_close) self.Bind(wx.EVT_MENU, self.about, self.menu_about_pysaved) self.Bind(wx.EVT_BUTTON, self.search_icon, self.button_search_icon) self.Bind(wx.EVT_BUTTON, self.search_execfile, self.button_search_execfile) self.Bind(wx.EVT_BUTTON, self.addPath, self.button_pathstosearchin_add) self.Bind(wx.EVT_BUTTON, self.editPath, self.button_pathstosearchin_edit) self.Bind(wx.EVT_BUTTON, self.delPath, self.button_pathstosearchin_del) self.Bind(wx.EVT_BUTTON, self.event_search_outpath, self.search_outpath) self.Bind(wx.EVT_BUTTON, self.event_search_temppath, self.search_temppath) self.Bind(wx.EVT_BUTTON, self.start, self.bitmap_start) self.Bind(wx.EVT_CLOSE, self.exit) self.__set_properties() self.__do_layout() self.project = Project() self.project.loadAllhiddenmodules(self) self.project.initialFrame(self) self.path = None self.progress= False def __set_properties(self): self.SetTitle("PySaved") self.SetMinSize(wx.Size(780, 820)) self.label_name.SetFont(wx.Font(11, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, "")) self.input_name.SetFont(wx.Font(11, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, "")) self.label_icon.SetFont(wx.Font(11, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, "")) self.input_icon.SetFont(wx.Font(11, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, "")) self.button_search_icon.SetSize(self.button_search_icon.GetBestSize()) self.label_execfile.SetFont(wx.Font(11, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, "")) self.input_execfile.SetFont(wx.Font(11, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, "")) self.button_search_execfile.SetSize(self.button_search_execfile.GetBestSize()) self.radiobox_console.SetFont(wx.Font(11, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, "")) try: self.radiobox_console.SetSelection(0) except: pass self.label_pathstosearchin.SetFont(wx.Font(11, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, "")) self.list_pathstosearchin.SetFont(wx.Font(11, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, "")) try: self.list_pathstosearchin.SetSelection(0) except: pass self.button_pathstosearchin_add.SetSize(self.button_pathstosearchin_add.GetBestSize()) self.button_pathstosearchin_edit.SetSize(self.button_pathstosearchin_edit.GetBestSize()) self.button_pathstosearchin_del.SetSize(self.button_pathstosearchin_del.GetBestSize()) self.label_hiddenmodules.SetFont(wx.Font(11, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, "")) try: self.list_hiddenmodules.SetSelection(0) except: pass self.label_outpath.SetFont(wx.Font(11, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, "")) self.input_outpath.SetFont(wx.Font(11, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, "")) self.search_outpath.SetSize(self.search_outpath.GetBestSize()) self.label_temppath.SetFont(wx.Font(11, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, "")) self.input_temppath.SetFont(wx.Font(11, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, "")) self.search_temppath.SetSize(self.search_temppath.GetBestSize()) self.radiobox_saveas.SetFont(wx.Font(11, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, "")) try: self.radiobox_saveas.SetSelection(0) except: pass self.checkbox_debug.SetFont(wx.Font(11, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, "")) self.checkbox_unicode.SetValue(1) self.bitmap_start.SetSize(self.bitmap_start.GetBestSize()) self.label_log.SetFont(wx.Font(11, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, "")) self.list_log.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, "")) try: self.list_log.SetSelection(0) except: pass def __do_layout(self): main_sizer = wx.FlexGridSizer(3, 3, 0, 0) grid_sizer_2 = wx.FlexGridSizer(9, 1, 10, 0) grid_sizer_4 = wx.FlexGridSizer(1, 2, 0, 10) grid_sizer_3 = wx.FlexGridSizer(2, 3, 15, 15) grid_sizer_5 = wx.FlexGridSizer(4, 1, 15, 0) grid_sizer_7 = wx.FlexGridSizer(2, 3, 15, 15) grid_sizer_8 = wx.FlexGridSizer(3, 1, 5, 0) grid_sizer_6 = wx.FlexGridSizer(3, 3, 10, 10) main_sizer.Add((20, 20), 0, 0, 0) main_sizer.Add((20, 20), 0, 0, 0) main_sizer.Add((20, 20), 0, 0, 0) main_sizer.Add((20, 20), 0, 0, 0) grid_sizer_6.Add(self.label_name, 0, wx.ALIGN_CENTER_VERTICAL, 0) grid_sizer_6.Add(self.input_name, 0, wx.EXPAND | wx.ALIGN_CENTER_VERTICAL, 0) grid_sizer_6.Add((10, 30), 0, 0, 0) grid_sizer_6.Add(self.label_icon, 0, wx.ALIGN_CENTER_VERTICAL, 0) grid_sizer_6.Add(self.input_icon, 0, wx.EXPAND | wx.ALIGN_CENTER_VERTICAL, 0) grid_sizer_6.Add(self.button_search_icon, 0, 0, 0) grid_sizer_6.Add(self.label_execfile, 0, wx.ALIGN_CENTER_VERTICAL, 0) grid_sizer_6.Add(self.input_execfile, 0, wx.EXPAND | wx.ALIGN_CENTER_VERTICAL, 0) grid_sizer_6.Add(self.button_search_execfile, 0, 0, 0) grid_sizer_6.AddGrowableCol(1) grid_sizer_5.Add(grid_sizer_6, 1, wx.EXPAND, 0) grid_sizer_5.Add(self.radiobox_console, 0, 0, 0) grid_sizer_5.Add(self.sl1, 0, wx.EXPAND, 0) grid_sizer_7.Add(self.label_pathstosearchin, 0, 0, 0) grid_sizer_7.Add(self.list_pathstosearchin, 0, wx.EXPAND, 0) grid_sizer_8.Add(self.button_pathstosearchin_add, 0, 0, 0) grid_sizer_8.Add(self.button_pathstosearchin_edit, 0, 0, 0) grid_sizer_8.Add(self.button_pathstosearchin_del, 0, 0, 0) grid_sizer_7.Add(grid_sizer_8, 1, wx.EXPAND, 0) grid_sizer_7.Add(self.label_hiddenmodules, 0, 0, 0) grid_sizer_7.Add(self.list_hiddenmodules, 0, wx.EXPAND, 0) grid_sizer_7.Add((20, 20), 0, 0, 0) grid_sizer_7.AddGrowableRow(0) grid_sizer_7.AddGrowableRow(1) grid_sizer_7.AddGrowableCol(1) grid_sizer_5.Add(grid_sizer_7, 1, wx.EXPAND, 0) self.nb_panel_1.SetSizer(grid_sizer_5) grid_sizer_5.AddGrowableRow(3) grid_sizer_5.AddGrowableCol(0) grid_sizer_3.Add(self.label_outpath, 0, wx.ALIGN_CENTER_VERTICAL, 0) grid_sizer_3.Add(self.input_outpath, 0, wx.EXPAND | wx.ALIGN_CENTER_VERTICAL, 0) grid_sizer_3.Add(self.search_outpath, 0, 0, 0) grid_sizer_3.Add(self.label_temppath, 0, wx.ALIGN_CENTER_VERTICAL, 0) grid_sizer_3.Add(self.input_temppath, 0, wx.EXPAND | wx.ALIGN_CENTER_VERTICAL, 0) grid_sizer_3.Add(self.search_temppath, 0, 0, 0) grid_sizer_3.AddGrowableCol(1) grid_sizer_2.Add(grid_sizer_3, 1, wx.EXPAND, 0) grid_sizer_2.Add(self.sl2, 0, wx.EXPAND, 0) grid_sizer_2.Add(self.radiobox_saveas, 0, 0, 0) grid_sizer_4.Add(self.checkbox_debug, 0, 0, 0) grid_sizer_4.Add(self.checkbox_unicode, 0, 0, 0) grid_sizer_2.Add(grid_sizer_4, 1, wx.EXPAND, 0) grid_sizer_2.Add(self.sl3, 0, wx.EXPAND, 0) grid_sizer_2.Add(self.bitmap_start, 0, wx.ALIGN_CENTER_HORIZONTAL, 0) grid_sizer_2.Add(self.sl4, 0, wx.EXPAND, 0) grid_sizer_2.Add(self.label_log, 0, 0, 0) grid_sizer_2.Add(self.list_log, 0, wx.EXPAND, 0) self.nb_pane_2.SetSizer(grid_sizer_2) grid_sizer_2.AddGrowableRow(8) grid_sizer_2.AddGrowableCol(0) self.nb.AddPage(self.nb_panel_1, "Project") self.nb.AddPage(self.nb_pane_2, "Build") main_sizer.Add(self.nb, 1, wx.EXPAND, 0) main_sizer.Add((20, 20), 0, 0, 0) main_sizer.Add((20, 20), 0, 0, 0) main_sizer.Add((20, 20), 0, 0, 0) main_sizer.Add((20, 20), 0, 0, 0) self.SetSizer(main_sizer) main_sizer.Fit(self) main_sizer.AddGrowableRow(1) main_sizer.AddGrowableCol(1) self.Layout() def askForSavingIfNeed(self): if (self.path == None or self.project.needSave(self)) and not self.project.isEmpty(self): res = wx.MessageDialog(self, "Do you want to save this project?", "Save?", wx.ICON_QUESTION | wx.YES_NO | wx.CANCEL | wx.YES_DEFAULT).ShowModal() if res == wx.ID_CANCEL: return False elif res == wx.ID_YES: self.save(None) return True def new(self, event): if self.askForSavingIfNeed(): self.project = Project() self.project.loadAllhiddenmodules(self) self.project.initialFrame(self) self.path = None def open(self, event=None, path=None): if self.askForSavingIfNeed(): if path == None: dia = wx.FileDialog(self, "Select a file to open", wildcard="PySaved-files (*.pysa)|*.pysa", style=wx.FD_OPEN) if dia.ShowModal() == wx.ID_OK: path = dia.GetPath() else: return try: print(u"Loading project from: '{0}'".format(path)) p = Project() p.load(self, path) self.project = p self.project.loadAllhiddenmodules(self) self.path = path except: wx.MessageDialog(self, u"Cannot open file: '{0}'".format(path), "Cannot open file", wx.ICON_ERROR).ShowModal() raise def save(self, event): if self.path == None: self.saveas(None) else: try: print(u"Saving project at: '{}'".format(self.path)) self.project.save(self, self.path) except: wx.MessageDialog(self, u"Cannot save file: '{0}'".format(self.path), "Cannot save file", wx.ICON_ERROR).ShowModal() self.path = None def saveas(self, event): dia = wx.FileDialog(self, "Select a file to save", wildcard="PySaved-files (*.pysa)|*.pysa", style=wx.FD_SAVE) if dia.ShowModal() == wx.ID_OK: self.path = dia.GetPath() if ".pysa" not in self.path: self.path += ".pysa" self.save(None) def exit(self, event): if self.askForSavingIfNeed() and not self.progress: print("\nQuit PySaved...") sys.exit(0) def search_icon(self, event): dia = wx.FileDialog(self, "Select a file to open", wildcard="Icon-files (*.ico)|*.ico", style=wx.FD_OPEN) if dia.ShowModal() == wx.ID_OK: self.input_icon.SetValue(dia.GetPath()) def search_execfile(self, event): dia = wx.FileDialog(self, "Select a file to open", wildcard="Python-files (*.py)|*.py", style=wx.FD_OPEN) if dia.ShowModal() == wx.ID_OK: self.input_execfile.SetValue(dia.GetPath()) def addPath(self, event): dia = wx.DirDialog(self, "Select a dir") if dia.ShowModal() == wx.ID_OK: if dia.GetPath() not in self.project.pathstosearchin: self.project.pathstosearchin.append(dia.GetPath()) self.project.loadAllhiddenmodules(self) def editPath(self, event): sel = self.list_pathstosearchin.GetSelection() strSel = self.list_pathstosearchin.GetStringSelection() if sel == -1: return while True: dia = wx.TextEntryDialog(self, u"Enter a new path for '{}'".format(strSel), "Edit Path", strSel) if dia.ShowModal() == wx.ID_OK: if dia.GetValue().strip() == "" or not os.path.exists(dia.GetValue()): wx.MessageDialog(self, "Unknown path!", "", wx.ICON_ERROR).ShowModal() else: self.project.pathstosearchin[sel] = dia.GetValue() self.project.loadAllhiddenmodules(self) break def delPath(self, event): sel = self.list_pathstosearchin.GetSelection() if sel == -1: return del(self.project.pathstosearchin[sel]) self.project.loadAllhiddenmodules(self) def event_search_outpath(self, event): dia = wx.DirDialog(self, "Select a dir to save in") if dia.ShowModal() == wx.ID_OK: self.input_outpath.SetValue(dia.GetPath()) def event_search_temppath(self, event): dia = wx.DirDialog(self, "Select a dir to save in") if dia.ShowModal() == wx.ID_OK: self.input_outpath.SetValue(dia.GetPath()) def start(self, event): self.project.loadFromFrame(self) c = builder.Connector(self.project) thread.start_new(self.loop, (c,)) thread.start_new(builder.build, (c,)) thread.start_new(builder.log, (c,)) def loop(self, c): def success(): wx.MessageDialog(self, "Building package successful!", "Successful!", wx.ICON_INFORMATION).ShowModal() def error(fm): wx.MessageDialog(self, u"Error while building package:\n\n{}".format(fm), "Error!", wx.ICON_ERROR).ShowModal() def log(l): self.list_log.SetItems(l) self.list_log.Select(len(l)-1) self.progress = True wx.CallAfter(self.Disable) while True: time.sleep(0.1) wx.CallAfter(log, c.log) if c.finished: wx.CallAfter(success) break elif c.error: wx.CallAfter(error, c.errormsg) break wx.CallAfter(self.Enable, True) self.progress = False def about(self, event): info = wx.AboutDialogInfo() info.SetName("PySaved") info.SetVersion("0.1") info.SetCopyright("(c) 2015 by Arne Hannappel") info.AddArtist("Adrian Gisder") info.SetWebSite("http://www.arnehannappel.de/index.php/programme/pysaved") info.SetDescription("PySaved is a simple GUI for PyInstaller, a program that converts Python (2.6-2.7) programs into stand-alone executables.") info.SetLicence(statics.gplv2) wx.AboutBox(info)