diff --git a/.gitignore b/.gitignore index 96403d3..4fcf078 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ __pycache__/* +.idea +venv/* diff --git a/main.py b/main.py index a7ae6e0..0ce1a9d 100644 --- a/main.py +++ b/main.py @@ -1,45 +1,109 @@ from tkinter import * from tkinter import filedialog from zipfile import ZipFile as zf -from PIL import Image -import time +from PIL import Image, ImageTk import io -page = 0 -file = '' +class MangaReader: + def __init__(self, master): + self.master = master + self.page = 0 + self.total = 0 + self.file = 'None' + self.img = '' -def open_menu(): - mangaFile = filedialog.askopenfilename() - file = mangaFile - displayManga(file,1) + master.title("Manga Reader") -def displayManga(file,pg): - with zf(file, 'r') as zip: - #grab all the manga pages from the cbz file and sort them to put them in the correct order - fl = zip.namelist() - fl.sort() - data = zip.read(fl[pg-1]) - im = Image.open(io.BytesIO(data)) - im.show() - page = pg + # tk window size and allow resize + master.geometry("700x900") + master.resizable(width=True, height=True) + + # Menu Bar + self.menu = Menu(master) + item = Menu(self.menu) + item.add_command(label="Open", command=self.open_menu) + item.add_separator() + item.add_command(label="Exit", command=master.quit) + self.menu.add_cascade(label="File", menu=item) + root.config(menu=self.menu) + + self.buttonFrame = Frame(master) + + # forward/back buttons + self.nextPg = Button(self.buttonFrame, text='>') + self.nextPg.bind('', self.nextPage) + self.nextPg.grid(row=0, column=2) + self.buttonFrame.pack(side=BOTTOM) + self.backPg = Button(self.buttonFrame, text='<') + self.backPg.bind('', self.backPage) + self.backPg.grid(row=0, column=0) + + # page counter + self.pgcount = Label(self.buttonFrame, text= str(self.page) + " of " + str(self.total)) + self.pgcount.grid(row=1, columns=1, columnspan=2) + + self.mangaTitle = Label(self.buttonFrame, text=self.file) + self.mangaTitle.grid(row=0, column=1) + + # display image + self.panel = Label(self.master, image=self.img) + self.panel.pack() + + def open_menu(self): + # file dialog. reset page counts, call display Maanga passing in starting values + mangaFile = filedialog.askopenfilename() + self.file = mangaFile + self.page = 0 + self.total = 0 + self.mangaTitle.configure(text=self.file) + self.displayManga(self.file, 0) + + def displayManga(self, file, pg): + basewidth = 500 + + with zf(file, 'r') as zip: + # grab all the manga pages from the cbz file and sort them to put them in the correct order + fl = zip.namelist() + fl.sort() + self.total = len(fl)-1 + # grab the current page out of the array. treat it as byte data since it's still zipped. + data = zip.read(fl[pg]) + im = Image.open(io.BytesIO(data)) + + wpercent = (basewidth / float(im.size[0])) + hsize = int((float(im.size[1]) * float(wpercent))) + + im = im.resize((basewidth, hsize), Image.ANTIALIAS) + #convert to tkImage and update the on screen image. + self.img = ImageTk.PhotoImage(im) + self.panel.config(image=self.img) + #finally update the current page count + self.pgcount.configure(text=str(pg+1) + " of " + str(self.total)) + + def nextPage(self, event): + self.page = self.page + 1 + if self.page < self.total: + self.displayManga(self.file, self.page) + else: + #reset self.page and doNothing + self.page = self.page - 1 + # self.doNothing() + + def backPage(self, event): + self.page = self.page - 1 + if self.page >= 0: + self.displayManga(self.file, self.page) + else: + #reset self.page and doNothing + self.page = self.page + 1 + # self.doNothing() + + def doNothing(self): + print(self.page) + print("FUCCK YOU") #initalize tk root=Tk() -root.title("Manga Reader") - -#tk window size and allow resize -root.geometry("500x300") -root.resizable(width=True, height=True) - -#Menu Bar -menu = Menu(root) -item = Menu(menu) -item.add_command(label="Open", command=open_menu) -item.add_separator() -item.add_command(label="Exit", command=root.quit) -menu.add_cascade(label="File", menu=item) -root.config(menu=menu) - - +app = MangaReader(root) root.mainloop() diff --git a/qt/main.py b/qt/main.py deleted file mode 100644 index 425c20b..0000000 --- a/qt/main.py +++ /dev/null @@ -1,20 +0,0 @@ -import sys -import readergui as rg - -from PyQt5.QtWidgets import QMainWindow, QApplication -from PyQt5.QtCore import Qt - -class Window(QMainWindow): - def __init__(self): - super(Window, self).__init__() - self.ui = rg.Ui_MainWindow() - self.ui.setupUi(self) - self.ui.nextButton.clicked.connect(self.but_test) - def but_test(self): - print("button clicked") - -if __name__ == '__main__': - app = QApplication(sys.argv) - window = Window() - window.show() - sys.exit(app.exec()) diff --git a/qt/reader.ui b/qt/reader.ui deleted file mode 100644 index 133bfcd..0000000 --- a/qt/reader.ui +++ /dev/null @@ -1,81 +0,0 @@ - - - MainWindow - - - - 0 - 0 - 480 - 640 - - - - MainWindow - - - - - - 10 - 10 - 461 - 511 - - - - - - - 70 - 140 - 174 - 34 - - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - - - - - 10 - 550 - 461 - 36 - - - - - - - Back - - - - - - - Next - - - - - - - - - - 0 - 0 - 480 - 30 - - - - - - - - diff --git a/qt/readergui.py b/qt/readergui.py deleted file mode 100644 index ebd383a..0000000 --- a/qt/readergui.py +++ /dev/null @@ -1,65 +0,0 @@ -# -*- coding: utf-8 -*- - -# Form implementation generated from reading ui file 'reader.ui' -# -# Created by: PyQt5 UI code generator 5.15.0 -# -# WARNING: Any manual changes made to this file will be lost when pyuic5 is -# run again. Do not edit this file unless you know what you are doing. - - -from PyQt5 import QtCore, QtGui, QtWidgets - - -class Ui_MainWindow(object): - def setupUi(self, MainWindow): - MainWindow.setObjectName("MainWindow") - MainWindow.resize(480, 640) - self.centralwidget = QtWidgets.QWidget(MainWindow) - self.centralwidget.setObjectName("centralwidget") - self.mainImage = QtWidgets.QGraphicsView(self.centralwidget) - self.mainImage.setGeometry(QtCore.QRect(10, 10, 461, 511)) - self.mainImage.setObjectName("mainImage") - self.testBox = QtWidgets.QDialogButtonBox(self.centralwidget) - self.testBox.setGeometry(QtCore.QRect(70, 140, 174, 34)) - self.testBox.setStandardButtons(QtWidgets.QDialogButtonBox.Cancel|QtWidgets.QDialogButtonBox.Ok) - self.testBox.setObjectName("testBox") - self.widget = QtWidgets.QWidget(self.centralwidget) - self.widget.setGeometry(QtCore.QRect(10, 550, 461, 36)) - self.widget.setObjectName("widget") - self.horizontalLayout = QtWidgets.QHBoxLayout(self.widget) - self.horizontalLayout.setContentsMargins(0, 0, 0, 0) - self.horizontalLayout.setObjectName("horizontalLayout") - self.backButton = QtWidgets.QPushButton(self.widget) - self.backButton.setObjectName("backButton") - self.horizontalLayout.addWidget(self.backButton) - self.nextButton = QtWidgets.QPushButton(self.widget) - self.nextButton.setObjectName("nextButton") - self.horizontalLayout.addWidget(self.nextButton) - MainWindow.setCentralWidget(self.centralwidget) - self.menubar = QtWidgets.QMenuBar(MainWindow) - self.menubar.setGeometry(QtCore.QRect(0, 0, 480, 30)) - self.menubar.setObjectName("menubar") - MainWindow.setMenuBar(self.menubar) - self.statusbar = QtWidgets.QStatusBar(MainWindow) - self.statusbar.setObjectName("statusbar") - MainWindow.setStatusBar(self.statusbar) - - self.retranslateUi(MainWindow) - QtCore.QMetaObject.connectSlotsByName(MainWindow) - - def retranslateUi(self, MainWindow): - _translate = QtCore.QCoreApplication.translate - MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow")) - self.backButton.setText(_translate("MainWindow", "Back")) - self.nextButton.setText(_translate("MainWindow", "Next")) - - -if __name__ == "__main__": - import sys - app = QtWidgets.QApplication(sys.argv) - MainWindow = QtWidgets.QMainWindow() - ui = Ui_MainWindow() - ui.setupUi(MainWindow) - MainWindow.show() - sys.exit(app.exec_()) diff --git a/required.txt b/required.txt index 52b0a16..334e961 100644 --- a/required.txt +++ b/required.txt @@ -1,8 +1 @@ -Package Version ----------- ------- -Pillow 7.2.0 -pip 20.2.2 -PyQt5 5.15.0 -PyQt5-sip 12.8.0 -setuptools 47.1.0 -tk 0.1.0 +Pillow==7.2.0