📄 btmaketorrentgui.py
字号:
EVT_BUTTON(frame, b4.GetId(), self.closewin) panel.SetSizer(border) panel.SetAutoLayout(true)# panel.DragAcceptFiles(true)# EVT_DROP_FILES(panel, self.selectdrop) def closewin(self, x): self.frame.Destroy() def saveconfig(self, x): self.piece_length.GetSelection() self.announceconf.saveDefault(self.piece_length.GetSelection(), self.annCtl.GetValue()) def addAnnounce(self, x): announceurl = self.annCtl.GetValue() if announceurl == "": return self.annCtl.Append(announceurl) self.announceconf.addAnnounce(announceurl) def removeAnnounce(self, x): if self.annCtl.GetSelection() == -1: dlg = wxMessageDialog(self.frame, "Please select announce url from combo box", "Error", wxICON_ERROR) dlg.ShowModal() dlg.Destroy() else: announceurl = self.annCtl.GetValue() i = self.annCtl.GetSelection() self.announceconf.removeAnnounce(announceurl) self.annCtl.Delete(i) def selectdir(self, x): dl = wxDirDialog(self.frame, style = wxDD_DEFAULT_STYLE | wxDD_NEW_DIR_BUTTON) if dl.ShowModal() == wxID_OK: self.dirCtl.SetValue(dl.GetPath()) def selectfile(self, x): dl = wxFileDialog (self.frame, 'Choose file or directory to use', '', '', '', wxOPEN) if dl.ShowModal() == wxID_OK: self.dirCtl.SetValue(dl.GetPath()) def selectdrop(self, x): print x list = x.m_files self.dirCtl.SetValue(x[0]) def announcecopy(self, x): dl = wxFileDialog (self.frame, 'Choose .torrent file to use', '', '', '*.torrent', wxOPEN) if dl.ShowModal() == wxID_OK: try: h = open(dl.GetPath(), 'rb') metainfo = bdecode(h.read()) h.close() self.annCtl.SetValue(metainfo['announce']) if metainfo.has_key('announce-list'): list = [] for tier in metainfo['announce-list']: for tracker in tier: list += [tracker, ', '] del list[-1] list += ['\n'] liststring = '' for i in list: liststring += i self.annListCtl.SetValue(liststring+'\n\n') else: self.annListCtl.SetValue('') except: return def getannouncelist(self): list = [] for t in self.annListCtl.GetValue().split('\n'): tier = [] t = t.replace(',',' ') for tr in t.split(' '): if tr != '': tier += [tr] if len(tier)>0: list.append(tier) return list def complete(self, x): if self.dirCtl.GetValue() == '': dlg = wxMessageDialog(self.frame, message = 'You must select a\n file or directory', caption = 'Error', style = wxOK | wxICON_ERROR) dlg.ShowModal() dlg.Destroy() return params = {'piece_size_pow2': self.piece_length_list[self.piece_length.GetSelection()]} annlist = self.getannouncelist() if len(annlist)>0: params['real_announce_list'] = annlist comment = self.commentCtl.GetValue() if comment != '': params['comment'] = comment try: CompleteDir(self.dirCtl.GetValue(), self.annCtl.GetValue(), params) except: print_exc()from traceback import print_excclass CompleteDir: def __init__(self, d, a, params): self.d = d self.a = a self.params = params self.flag = Event() self.separatetorrents = false if isdir(d): self.choicemade = Event() frame = wxFrame(None, -1, 'BitTorrent make torrent', size = (1,1)) self.frame = frame panel = wxPanel(frame, -1) gridSizer = wxFlexGridSizer(cols = 1, vgap = 8, hgap = 8) gridSizer.AddGrowableRow(1) gridSizer.Add(wxStaticText(panel, -1, 'Do you want to make a separate .torrent'),0,wxALIGN_CENTER) gridSizer.Add(wxStaticText(panel, -1, 'for every item in this directory?'),0,wxALIGN_CENTER) gridSizer.Add(wxStaticText(panel, -1, '')) b = wxFlexGridSizer(cols = 3, hgap = 10) yesbut = wxButton(panel, -1, 'Yes') def saidyes(e, self = self): self.frame.Destroy() self.separatetorrents = true self.begin() EVT_BUTTON(frame, yesbut.GetId(), saidyes) b.Add(yesbut, 0) nobut = wxButton(panel, -1, 'No') def saidno(e, self = self): self.frame.Destroy() self.begin() EVT_BUTTON(frame, nobut.GetId(), saidno) b.Add(nobut, 0) cancelbut = wxButton(panel, -1, 'Cancel') def canceled(e, self = self): self.frame.Destroy() EVT_BUTTON(frame, cancelbut.GetId(), canceled) b.Add(cancelbut, 0) gridSizer.Add(b, 0, wxALIGN_CENTER) border = wxBoxSizer(wxHORIZONTAL) border.Add(gridSizer, 1, wxEXPAND | wxALL, 4) panel.SetSizer(border) panel.SetAutoLayout(true) frame.Show() border.Fit(panel) frame.Fit() else: self.begin() def begin(self): if self.separatetorrents: frame = wxFrame(None, -1, 'BitTorrent make directory', size = wxSize(550, 250)) else: frame = wxFrame(None, -1, 'BitTorrent make torrent', size = wxSize(550, 250)) self.frame = frame panel = wxPanel(frame, -1) gridSizer = wxFlexGridSizer(cols = 1, vgap = 15, hgap = 8) if self.separatetorrents: self.currentLabel = wxStaticText(panel, -1, 'checking file sizes') else: self.currentLabel = wxStaticText(panel, -1, 'building ' + self.d + '.torrent') gridSizer.Add(self.currentLabel, 0, wxEXPAND) self.gauge = wxGauge(panel, -1, range = 1000, style = wxGA_SMOOTH) gridSizer.Add(self.gauge, 0, wxEXPAND) gridSizer.Add(10, 10, 1, wxEXPAND) self.button = wxButton(panel, -1, 'cancel') gridSizer.Add(self.button, 0, wxALIGN_CENTER) gridSizer.AddGrowableRow(2) gridSizer.AddGrowableCol(0) g2 = wxFlexGridSizer(cols = 1, vgap = 15, hgap = 8) g2.Add(gridSizer, 1, wxEXPAND | wxALL, 25) g2.AddGrowableRow(0) g2.AddGrowableCol(0) panel.SetSizer(g2) panel.SetAutoLayout(true) EVT_BUTTON(frame, self.button.GetId(), self.done) EVT_CLOSE(frame, self.done) EVT_INVOKE(frame, self.onInvoke) frame.Show(true) Thread(target = self.complete).start() def complete(self): try: if self.separatetorrents: completedir(self.d, self.a, self.params, self.flag, self.valcallback, self.filecallback) else: make_meta_file(self.d, self.a, self.params, self.flag, self.valcallback, progress_percent = 1) if not self.flag.isSet(): self.currentLabel.SetLabel('Done!') self.gauge.SetValue(1000) self.button.SetLabel('Close') self.frame.Refresh() except (OSError, IOError), e: self.currentLabel.SetLabel('Error!') self.button.SetLabel('Close') dlg = wxMessageDialog(self.frame, message = 'Error - ' + str(e), caption = 'Error', style = wxOK | wxICON_ERROR) dlg.ShowModal() dlg.Destroy() def valcallback(self, amount): self.invokeLater(self.onval, [amount]) def onval(self, amount): self.gauge.SetValue(int(amount * 1000)) def filecallback(self, f): self.invokeLater(self.onfile, [f]) def onfile(self, f): self.currentLabel.SetLabel('building ' + join(self.d, f) + '.torrent') def onInvoke(self, event): if not self.flag.isSet(): apply(event.func, event.args, event.kwargs) def invokeLater(self, func, args = [], kwargs = {}): if not self.flag.isSet(): wxPostEvent(self.frame, InvokeEvent(func, args, kwargs)) def done(self, event): self.flag.set() self.frame.Destroy()class btWxApp(wxApp): def OnInit(self): d = DownloadInfo() d.frame.Show(true) self.SetTopWindow(d.frame) return trueif __name__ == '__main__': btWxApp().MainLoop()
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -