Oui, le temps de démarrage était aussi pour moi une inconnue.
J'ai donc attaqué ces tests en premier, et je peux vous faire tester un premier script qui devrait vous rassurer sur la question.
Un point que j'avais oublié de préciser, ce n'est pas du GTK que je ne connait pas du tout c'est du Qt
Donc pour tester le script il faut PyQt. si vous ne l'avez pas encore, dans l'installateur de paquet que vous utilisez, cherchez python-qt4.
Copier le script ci-dessous dans un blocnote et enregistrez-le de préférence dans un nouveau dossier avec l'extension py.
Exemple : ~/newFolder/newArte7.py
Ensuite, lancer arte7Recorder, ne le fermez pas, aller dans votre dossier /tmp et copier le fichier database.
Coller-le en compagnie du script, c'est la raison du nouveau dossier.
Fermez arte7recorder, il n'a servit qu'à créer le fichier database.
lancez le script :
python newFolder/newArte7.py
Le script :
# -*- coding: utf-8 -*-
# arteGui
#
# Date: Mon Oct 4 2010
# Author : Vincent Vande Vyvre <vins@swing.be>
# Version 0.1
#
# Graphical user's interface for Arte7Recorder
import os
import glob
import urllib2
from threading import Thread
from PyQt4 import QtCore, QtGui
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(900, 700)
self.centralwidget = QtGui.QWidget(MainWindow)
self.gridLayout = QtGui.QGridLayout(self.centralwidget)
self.splitter = QtGui.QSplitter(self.centralwidget)
self.splitter.setOrientation(QtCore.Qt.Vertical)
self.splitter.setChildrenCollapsible(True)
self.preview = Preview(self.splitter)
self.editor = QtGui.QPlainTextEdit(self.splitter)
sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding,
QtGui.QSizePolicy.MinimumExpanding)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.editor.sizePolicy()
.hasHeightForWidth())
self.editor.setSizePolicy(sizePolicy)
self.editor.setMaximumSize(QtCore.QSize(16777215, 150))
self.editor.setAcceptDrops(False)
self.editor.setDocumentTitle("None")
self.editor.setUndoRedoEnabled(False)
self.editor.setPlainText("None")
self.editor.setTextInteractionFlags(QtCore.Qt.TextSelectableByKeyboard|
QtCore.Qt.TextSelectableByMouse)
self.gridLayout.addWidget(self.splitter, 0, 0, 1, 1)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtGui.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 717, 25))
self.menu_Options = QtGui.QMenu(self.menubar)
self.menu_File = QtGui.QMenu(self.menubar)
self.menu_Help = QtGui.QMenu(self.menubar)
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtGui.QStatusBar(MainWindow)
MainWindow.setStatusBar(self.statusbar)
# Tool panel
self.tool_panel = QtGui.QDockWidget(MainWindow)
self.tool_panel.setAllowedAreas(QtCore.Qt.LeftDockWidgetArea|
QtCore.Qt.RightDockWidgetArea)
self.tool_panel.setWindowTitle("None")
self.dockWidgetContents = QtGui.QWidget()
self.verticalLayout_2 = QtGui.QVBoxLayout(self.dockWidgetContents)
self.verticalLayout = QtGui.QVBoxLayout()
# List of downloadable videos
self.list_dwnld = ListDwnld(self.dockWidgetContents)
self.verticalLayout.addWidget(self.list_dwnld)
self.horizontalLayout = QtGui.QHBoxLayout()
self.add_btn = QtGui.QToolButton(self.dockWidgetContents)
icon = QtGui.QIcon()
icon.addPixmap(QtGui.QPixmap("medias/add.png"), QtGui.QIcon.Normal,
QtGui.QIcon.Off)
self.add_btn.setIcon(icon)
self.horizontalLayout.addWidget(self.add_btn)
self.remove_btn = QtGui.QToolButton(self.dockWidgetContents)
icon1 = QtGui.QIcon()
icon1.addPixmap(QtGui.QPixmap("medias/remove.png"), QtGui.QIcon.Normal,
QtGui.QIcon.Off)
self.remove_btn.setIcon(icon1)
self.horizontalLayout.addWidget(self.remove_btn)
self.up_btn = QtGui.QToolButton(self.dockWidgetContents)
icon2 = QtGui.QIcon()
icon2.addPixmap(QtGui.QPixmap("medias/up.svg"), QtGui.QIcon.Normal,
QtGui.QIcon.Off)
self.up_btn.setIcon(icon2)
self.horizontalLayout.addWidget(self.up_btn)
self.down_btn = QtGui.QToolButton(self.dockWidgetContents)
icon3 = QtGui.QIcon()
icon3.addPixmap(QtGui.QPixmap("medias/down.svg"), QtGui.QIcon.Normal,
QtGui.QIcon.Off)
self.down_btn.setIcon(icon3)
self.horizontalLayout.addWidget(self.down_btn)
self.verticalLayout.addLayout(self.horizontalLayout)
self.Download_btn = QtGui.QToolButton(self.dockWidgetContents)
sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred,
QtGui.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.Download_btn.sizePolicy()
.hasHeightForWidth())
self.Download_btn.setSizePolicy(sizePolicy)
self.Download_btn.setText("Download")
self.verticalLayout.addWidget(self.Download_btn)
self.prog_bar = QtGui.QProgressBar(self.dockWidgetContents)
self.prog_bar.setProperty("value", 0)
self.verticalLayout.addWidget(self.prog_bar)
self.cancel_btn = QtGui.QToolButton(self.dockWidgetContents)
sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred,
QtGui.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.cancel_btn.sizePolicy()
.hasHeightForWidth())
self.cancel_btn.setSizePolicy(sizePolicy)
self.cancel_btn.setText("Cancel")
self.verticalLayout.addWidget(self.cancel_btn)
self.save_txt_btn = QtGui.QToolButton(self.dockWidgetContents)
sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred,
QtGui.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.save_txt_btn.sizePolicy()
.hasHeightForWidth())
self.save_txt_btn.setSizePolicy(sizePolicy)
self.save_txt_btn.setText("Save text")
self.verticalLayout.addWidget(self.save_txt_btn)
self.verticalLayout_2.addLayout(self.verticalLayout)
self.tool_panel.setWidget(self.dockWidgetContents)
MainWindow.addDockWidget(QtCore.Qt.DockWidgetArea(2), self.tool_panel)
self.action_Folder = QtGui.QAction(MainWindow)
self.action_Index = QtGui.QAction(MainWindow)
self.action_Connection = QtGui.QAction(MainWindow)
self.action_About = QtGui.QAction(MainWindow)
self.action_Download = QtGui.QAction(MainWindow)
self.action_Cancel = QtGui.QAction(MainWindow)
self.action_Quit = QtGui.QAction(MainWindow)
self.menu_Options.addAction(self.action_Folder)
self.menu_Options.addAction(self.action_Index)
self.menu_File.addAction(self.action_Connection)
self.menu_File.addAction(self.action_Download)
self.menu_File.addAction(self.action_Cancel)
self.menu_File.addSeparator()
self.menu_File.addAction(self.action_Quit)
self.menu_Help.addAction(self.action_About)
self.menubar.addAction(self.menu_File.menuAction())
self.menubar.addAction(self.menu_Options.menuAction())
self.menubar.addAction(self.menu_Help.menuAction())
self.editor.clear()
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
MainWindow.show()
QtCore.QCoreApplication.processEvents()
ui.populate()
def retranslateUi(self, MainWindow):
MainWindow.setWindowTitle(QtGui.QApplication.translate("MainWindow",
"MainWindow", None, QtGui.QApplication.UnicodeUTF8))
self.menu_Options.setTitle(QtGui.QApplication.translate("MainWindow",
"&Options", None, QtGui.QApplication.UnicodeUTF8))
self.menu_File.setTitle(QtGui.QApplication.translate("MainWindow",
"&File", None, QtGui.QApplication.UnicodeUTF8))
self.menu_Help.setTitle(QtGui.QApplication.translate("MainWindow",
"&Help", None, QtGui.QApplication.UnicodeUTF8))
self.add_btn.setStatusTip(QtGui.QApplication.translate("MainWindow",
"Add the selected video.", None,
QtGui.QApplication.UnicodeUTF8))
self.remove_btn.setStatusTip(QtGui.QApplication.translate("MainWindow",
"Remove selected video(s) from the list", None,
QtGui.QApplication.UnicodeUTF8))
self.up_btn.setStatusTip(QtGui.QApplication.translate("MainWindow",
"Move up.", None, QtGui.QApplication.UnicodeUTF8))
self.down_btn.setStatusTip(QtGui.QApplication.translate("MainWindow",
"move down", None, QtGui.QApplication.UnicodeUTF8))
self.Download_btn.setStatusTip(QtGui.QApplication.translate(
"MainWindow", "Download now", None,
QtGui.QApplication.UnicodeUTF8))
self.cancel_btn.setStatusTip(QtGui.QApplication.translate("MainWindow",
"Abort download", None,
QtGui.QApplication.UnicodeUTF8))
self.save_txt_btn.setStatusTip(QtGui.QApplication.translate(
"MainWindow", "Save the pitch.", None,
QtGui.QApplication.UnicodeUTF8))
self.action_Folder.setText(QtGui.QApplication.translate("MainWindow",
"&Folder", None, QtGui.QApplication.UnicodeUTF8))
self.action_Index.setText(QtGui.QApplication.translate("MainWindow",
"&Index", None, QtGui.QApplication.UnicodeUTF8))
self.action_Connection.setText(QtGui.QApplication.translate("MainWindow",
"&Connection", None, QtGui.QApplication.UnicodeUTF8))
self.action_About.setText(QtGui.QApplication.translate("MainWindow",
"&About", None, QtGui.QApplication.UnicodeUTF8))
self.action_Download.setText(QtGui.QApplication.translate("MainWindow",
"&Download", None, QtGui.QApplication.UnicodeUTF8))
self.action_Cancel.setText(QtGui.QApplication.translate("MainWindow",
"&Cancel", None, QtGui.QApplication.UnicodeUTF8))
self.action_Quit.setText(QtGui.QApplication.translate("MainWindow",
"&Quit", None, QtGui.QApplication.UnicodeUTF8))
def select_item(self, old, new):
print "Unselected :", old, "Selected :", new
def move_item(self, item):
print "Item :", item
def select_video(self, old, new):
print "Unselected :", old, "Selected :", new
def populate(self):
self.liststore = []
self.sgl = Signal()
self.sgl.bind(self)
f = open ("database", "r")
for line in f:
t = line.split(";")
self.liststore.append([t[0], t[1], t[2], t[3]])
self.items = []
self.videos = []
self.counter = 0
f = self.liststore[0]
img_ldr = ImageLoader(f[3])
img_ldr.start()
def next_thumbnail(self):
video_item = VideoItem(self.liststore[self.counter])
img = QtGui.QPixmap("image.jpg")
pix = img.scaled(160, 160, QtCore.Qt.KeepAspectRatio,
QtCore.Qt.FastTransformation)
video_item.pixmap = pix
#icon = self.create_icon(pix)
item = QtGui.QListWidgetItem(self.preview)
#ic = QtGui.QIcon(icon)
item.setIcon(QtGui.QIcon(pix))
item.setText("None")
item.setTextAlignment(QtCore.Qt.AlignHCenter)
item.setFlags(QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled)
QtCore.QCoreApplication.processEvents()
self.items.append(item)
self.videos.append(video_item)
self.counter += 1
if not self.counter == len(self.liststore):
f = self.liststore[self.counter]
video_item = VideoItem(f)
img_ldr = ImageLoader(f[3])
img_ldr.start()
def create_icon(self, img):
"""Create thumbnail.
Thumbnail is a square background icosize x icosize, color black,
the image is paste at vertical center and at down edge, and a
white frame is painted around the image with a space of 2 pixels.
Keyword arguments :
img -- pixmap 160x160
Return :
framed thumbnail
"""
#color = self.color_opt
#background
b = 160 + 5
w = float(QtCore.QSize.width(img.size()))
h = float(QtCore.QSize.height(img.size()))
#coordonates top left of thumbnail
bw, bh = (b/2)-(w/2), b-h-3
#painting zone
rect = QtCore.QRect(bw, bh, w, h)
#painting source (all, of course)
irect = QtCore.QRect(0.0, 0.0, w, h)
#border = image size + (2*3)
cw, ch = w + 3, h + 3
#black border
brect = QtCore.QRect(bw-2, bh-2, cw, ch)
bckgrnd = QtGui.QPixmap(QtCore.QSize(b, b))
bckgrnd.fill(QtGui.QColor("black"))
painter = QtGui.QPainter()
painter.begin(bckgrnd)
painter.setPen(QtGui.QPen(QtCore.Qt.white, 1,
QtCore.Qt.SolidLine, QtCore.Qt.RoundCap,
QtCore.Qt.MiterJoin))
painter.drawRect(brect)
painter.drawPixmap(rect, img, irect)
painter.end()
return bckgrnd
class Preview(QtGui.QListWidget):
def __init__(self, parent=None):
super(Preview, self).__init__(parent)
self.setMinimumSize(QtCore.QSize(0, 0))
self.setStyleSheet("QWidget {color: white; background: black}")
self.setFrameShape(QtGui.QFrame.Box)
self.setFrameShadow(QtGui.QFrame.Sunken)
self.setDragEnabled(True)
self.setDragDropMode(QtGui.QAbstractItemView.DragDrop)
self.setDefaultDropAction(QtCore.Qt.MoveAction)
self.setSelectionMode(QtGui.QAbstractItemView.SingleSelection)
self.setIconSize(QtCore.QSize(160, 160))
self.setFlow(QtGui.QListView.LeftToRight)
self.setViewMode(QtGui.QListView.IconMode)
self.currentItemChanged.connect(ui.select_item)
self.itemDoubleClicked.connect(ui.move_item)
def startDrag(self, event):
#print "Mouse press event"
it = self.itemAt(event.pos())
print "Item :", it
idx = ui.items.index(it)
#index = int(self.indexAt(event.pos()))
if not it:
return
print "Drag item :", idx
mimeData = QtCore.QMimeData()
mimeData.setText(str(idx))
drag = QtGui.QDrag(self)
drag.setMimeData(mimeData)
#print "Text :", t, "Source :", drag.source(), "Index :", index
pixmap = QtGui.QPixmap(ui.videos[idx].pixmap)
drag.setPixmap(pixmap)
drag.setHotSpot(QtCore.QPoint(pixmap.width()/2, pixmap.height()))
drag.setPixmap(pixmap)
result = drag.start(QtCore.Qt.MoveAction)
def mouseMoveEvent(self, event):
self.startDrag(event)
def keyPressEvent(self, event):
print "Key :", event.key()
def resizeEvent(self, event):
#print "event1"
#Window is resized
if event.type() == 14:
#print "resize"
self.setSpacing(10)
self.updateGeometries()
event.accept()
class ListDwnld(QtGui.QListWidget):
def __init__(self, parent=None):
super(ListDwnld, self).__init__(parent)
self.setBaseSize(QtCore.QSize(150, 0))
self.setDragDropMode(QtGui.QAbstractItemView.DropOnly)
self.setAlternatingRowColors(True)
self.setSelectionMode(QtGui.QAbstractItemView
.MultiSelection)
self.setIconSize(QtCore.QSize(100, 100))
self.lst_videos = []
self.currentItemChanged.connect(ui.select_video)
def dragEnterEvent(self, event):
if event.mimeData().hasText():
#print "Enter in table"
event.accept()
else:
event.ignore()
def dragMoveEvent(self, event):
if event.mimeData().hasText():
event.setDropAction(QtCore.Qt.MoveAction)
event.accept()
else:
event.ignore()
def dragLeaveEvent(self, event):
#print "Leave event"
pass
def dropEvent(self, event):
data = event.mimeData()
#print "drop :", data.text()
self.add_object(data.text())
event.accept()
def add_object(self, item):
print "Item : ", item, type(item)
idx = eval(str(item))
img = ui.videos[idx].pixmap
pix = img.scaled(100, 100, QtCore.Qt.KeepAspectRatio,
QtCore.Qt.FastTransformation)
item = QtGui.QListWidgetItem(self)
item.setIcon(QtGui.QIcon(pix))
item.setText("None")
item.setTextAlignment(QtCore.Qt.AlignHCenter)
item.setFlags(QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled)
self.lst_videos.append(ui.videos[idx].thumbnail)
class VideoItem(object):
def __init__(self, item):
self.thumbnail = item
class Signal(QtCore.QObject):
loadFinished = QtCore.pyqtSignal()
def bind(self, w):
self.w = w
self.loadFinished.connect(self.next)
def emit_signal(self):
print "Emit"
self.loadFinished.emit()
def next(self):
print "Recept"
self.w.next_thumbnail()
class ImageLoader(Thread):
def __init__(self, url):
self.url = url
Thread.__init__(self)
def run(self):
local = open("image.jpg", 'wb')
f = urllib2.urlopen(self.url)
local.write(f.read())
local.close()
print "Image loaded"
ui.sgl.emit_signal()
if __name__ == "__main__":
import sys
app = QtGui.QApplication(sys.argv)
MainWindow = QtGui.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
sys.exit(app.exec_())
Il est normal que divers textes apparaissent dans la console, ils me servent à voir ce qui se passe "dans le moteur".
Pendant que les images se chargent testez déjà le drag and drop vers la fenêtre de droite pour vous convaincre que le chargement des image n'amène aucune contrainte de temps.
Les boutons et les menus ne sont pas encore "raccordés", et ne sont évidemment pas définitifs non plus.
@ plus
edit : Vous ne verrez pas les icônes sur les boutons, bien sur.