Skip to content

Commit 6b2d343

Browse files
committedMar 7, 2019
File Duplicator
1 parent 12b8d41 commit 6b2d343

File tree

1 file changed

+86
-0
lines changed

1 file changed

+86
-0
lines changed
 
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
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

Comments
 (0)
Please sign in to comment.