|
| 1 | +from tkinter import * |
| 2 | +from tkinter import filedialog, messagebox |
| 3 | +import ez, os |
| 4 | +from eztk import setEntryHint |
| 5 | + |
| 6 | +DIRECTORY = 'Directory' |
| 7 | +PATTERN = 'Pattern' |
| 8 | +NUMBER = 'NumbersOnly' |
| 9 | + |
| 10 | +class Duplicator(Frame): |
| 11 | + def __init__(self, master): |
| 12 | + Frame.__init__(self, master) |
| 13 | + self.master = master |
| 14 | + self.settings = ez.Settings(__file__) |
| 15 | + self.frames = [Frame(self) for _ in range(3)] |
| 16 | + self.selectButton = Button(self.frames[0], text = 'Select File', command = self.select) |
| 17 | + self.dupButton = Button(self.frames[0], text = 'Duplicate', command = self.duplicate) |
| 18 | + self.fileLabel = Label(self.frames[1], text = 'File: ') |
| 19 | + self.filenameLabel = Label(self.frames[1]) |
| 20 | + self.copiesLabel = Label(self.frames[1], text = 'Copies: ') |
| 21 | + self.copiesEntry = Entry(self.frames[1]) |
| 22 | + self.copiesEntry.focus() |
| 23 | + self.patternLabel = Label(self.frames[1], text = 'Pattern: ') |
| 24 | + self.patternEntry = Entry(self.frames[1], text = self.settings.setdefault(PATTERN, ''), width = 40) |
| 25 | + self.patternHint = 'Example: " (?)" -> "filename (1)"' |
| 26 | + setEntryHint(self.patternEntry, self.patternHint) |
| 27 | + self.numbersOnlyLabel = Label(self.frames[1], text = 'Numbers Only: ') |
| 28 | + self.numbersOnlyVar = BooleanVar(self, value = self.settings.setdefault(NUMBER, False)) |
| 29 | + self.numbersOnlyButton = Checkbutton(self.frames[1], variable = self.numbersOnlyVar, \ |
| 30 | + command = lambda: self.settings.set(NUMBER, self.numbersOnlyVar.get())) |
| 31 | + self.startLabel = Label(self.frames[1], text = 'Start Number: ') |
| 32 | + self.startEntry = Entry(self.frames[1], textvariable = IntVar(self, value = 1)) |
| 33 | + for i, w in enumerate(self.frames): |
| 34 | + w.grid(row = i, column = 0, sticky = NSEW) |
| 35 | + for i, w in enumerate([self.selectButton, self.dupButton]): |
| 36 | + w.grid(row = 0, column = i, sticky = NSEW) |
| 37 | + for i, widgets in enumerate(zip([self.fileLabel, self.filenameLabel], |
| 38 | + [self.copiesLabel, self.copiesEntry], |
| 39 | + [self.patternLabel, self.patternEntry], |
| 40 | + [self.numbersOnlyLabel, self.numbersOnlyButton], |
| 41 | + [self.startLabel, self.startEntry])): |
| 42 | + for j, w in enumerate(widgets): |
| 43 | + w.grid(row = j, column = i, sticky = NSEW if j else None) |
| 44 | + self.entries = [self.copiesEntry, self.patternEntry, self.startEntry] |
| 45 | + for e in self.entries: |
| 46 | + e.bind('<Up>', self.switch) |
| 47 | + e.bind('<Down>', self.switch) |
| 48 | + |
| 49 | + def select(self): |
| 50 | + filename = filedialog.askopenfilename(initialdir = self.settings.setdefault(DIRECTORY, ''), \ |
| 51 | + title = 'Select a File') |
| 52 | + if not filename: return |
| 53 | + self.settings[DIRECTORY] = os.path.dirname(filename) |
| 54 | + self.filenameLabel['text'] = filename |
| 55 | + |
| 56 | + def duplicate(self): |
| 57 | + filename = self.filenameLabel['text'] |
| 58 | + if not filename: |
| 59 | + messagebox.showerror(title = 'Error', message = 'No File Selected') |
| 60 | + return |
| 61 | + copies = self.copiesEntry.get() |
| 62 | + if not copies.isnumeric(): |
| 63 | + messagebox.showerror(title = 'Error', message = 'Please Input Numerical Value for Copies!') |
| 64 | + return |
| 65 | + copies = int(copies) |
| 66 | + pattern = self.patternEntry.get().strip() |
| 67 | + if pattern == self.patternHint or pattern == '': |
| 68 | + pattern = '' |
| 69 | + elif '?' not in pattern: |
| 70 | + messagebox.showerror(title = 'Error', message = 'No "?" Found in Pattern!') |
| 71 | + return |
| 72 | + self.settings[PATTERN] = pattern |
| 73 | + numbersOnly = self.numbersOnlyVar.get() |
| 74 | + start = int(self.startEntry.get()) |
| 75 | + ez.dupFile(filename, copies, pattern, numbersOnly, start) |
| 76 | + messagebox.showinfo(title = 'Finished', message = 'Done!') |
| 77 | + |
| 78 | + def switch(self, event): |
| 79 | + self.entries[(self.entries.index(self.master.focus_get()) + (-1) ** (event.keysym == 'Up')) % len(self.entries)].focus() |
| 80 | + |
| 81 | +root = Tk() |
| 82 | +app = Duplicator(root) |
| 83 | +app.pack() |
| 84 | +root.title('File Duplicator') |
| 85 | +ez.py2pyw(__file__) |
| 86 | +root.mainloop() |
0 commit comments