RkBlog

Hardware, programming and astronomy tutorials and reviews.

Qyolk I - widżety list w PyQT4

Tworzymy aplikację graficzną w PyQt4 z wykorzystaniem biblioteki Yolk do zarządzania pakietami Pythona zainstalowanymi z serwisu pypi (egg)

W QT4 i PyQT4 mamy trzy widżety służące do kolekcjonowania wpisów (listy) - List View będący zwykłą listą, Tree View czyli widok drzewa i Table View czyli tabela. Te trzy widgety dostępne są dla frameworka kolekcji (Model Based) oraz jako zwykłe widżety (Item Based). My zajmiemy się tym drugim typem - zwykłymi widżetami. W QTDesignerze trzeba uważać, który typ się wybiera, gdyż ma to duży wpływ na aplikację:
qyolk1
Dla przykładu użyłem Tree Widget. Przy kliknięciu prawym klawiszem myszy nad widgetem wyświetli się menu wraz z opcją "Edit Items" co pozwoli nam dodać kolumny (podobnie w pozostałych dwóch). O czym musimy pamiętać, to że kolumny dostają numery od zera. Jest to ważne, gdyż po tych numerach będziemy mogli operować na danej kolumnie:
qyolk2
qyolk3
Przeglądając dokumentację QTreeWidget trzeba też zajżeć do dziedziczonej klasy QTreeView.

QYolk

Na cheeseshop pojawił się niedawno aplikacja o nazwie Yolk ułatwiająca przeglądanie modułów Pythona zainstalowanych za pomocą easy_install z setuptools. Instalujemy go poleceniem:
easy_install yolk
A po tym możemy wydać polecenie:
yolk -l
By wyświetlić listę zainstalowanych pakietów. Naszym celem będzie zrobienie takiej samej listy w PyQT4. Dane zapewni nam poniższy kod:
from yolk import yolklib
packages = yolklib.Distributions()
for pkg in packages.get_distributions('all'):
	print pkg[0]
	print pkg[1]
	print '#####'
Metoda get_distributions to generator zwracający nazwę pakietów wraz z wersją oraz stan pakietu Aktywny/Nieaktywny. W QTDesignerze stworzyłem proste GUI złożone z QTreeWidget o nazwie treeList. Okno aplikacji nazwałem QYolk, a interfejs zapisałem jako qyolk.ui generując qyolk.py:
qyolk3
Oto bazowa wersja start.py:
# -*- coding: utf-8 -*-
import sys
from PyQt4 import QtCore, QtGui
from qyolk import Ui_QYolk
from yolk import yolklib

class StartQT4(QtGui.QMainWindow):
	def __init__(self, parent=None):
		QtGui.QWidget.__init__(self, parent)
		self.ui = Ui_QYolk()
		self.ui.setupUi(self)
		# set the widths of the columns
		self.ui.treeList.setColumnWidth(0,200)
		self.ui.treeList.setColumnWidth(1,100)
	
if __name__ == "__main__":
	app = QtGui.QApplication(sys.argv)
	myapp = StartQT4()
	myapp.show()
	sys.exit(app.exec_())
Zastosowana metoda setColumnWidth pochodzi z QTreeView i ustawia długość kolumny. "0" oznacza pierwszą, a "1" drugą kolumnę. Teraz wypełnijmy danymi. By dodać wiersz do drzewa trzeba użyć QTreeWidgetItem:
a = QtGui.QTreeWidgetItem(self.ui.treeList)
a.setText(0, 'a')
a.setText(1, 'b')
a.setText(2, 'c')
Jako parametr QTreeWidgetItem podajemy obiekt QTreeWidget, a następnie używamy metody setText(ID Kolumny, Tekst) do podania wartości dla danej kolumny. Mając listę czy generator wystarczy pętla, oto zmodyfikowany start.py:
# -*- coding: utf-8 -*-
import sys
from PyQt4 import QtCore, QtGui
from qyolk import Ui_QYolk
from yolk import yolklib

class StartQT4(QtGui.QMainWindow):
	def __init__(self, parent=None):
		QtGui.QWidget.__init__(self, parent)
		self.ui = Ui_QYolk()
		self.ui.setupUi(self)
		# set the widths of the columns
		self.ui.treeList.setColumnWidth(0,200)
		self.ui.treeList.setColumnWidth(1,100)
		# generator which retuns list of installed packages
		packages = yolklib.Distributions()
		for pkg in packages.get_distributions('all'):
			a = QtGui.QTreeWidgetItem(self.ui.treeList)
			pk = str(pkg[0]).split(' ')
			if pkg[1]:
				status = 'Active'
			else:
				status = 'Not Active'
			a.setText(0, pk[0])
			a.setText(1, pk[1])
			a.setText(2, status)
	
if __name__ == "__main__":
	app = QtGui.QApplication(sys.argv)
	myapp = StartQT4()
	myapp.show()
	sys.exit(app.exec_())
I gotowe. Otrzymamy ładną listę zainstalowanych pakietów. Możemy też np. zmienić kolor czcionki danego wpisu w danej kolumnie za pomocą setTextColor (dla QTreeWidgetItem). Więc np. zróbmy szary tekst dla nieaktywnych pakietów (nieaktywne - istnieje zainstalowana nowsza wersja):
# -*- coding: utf-8 -*-
import sys
from PyQt4 import QtCore, QtGui
from qyolk import Ui_QYolk
from yolk import yolklib

class StartQT4(QtGui.QMainWindow):
	def __init__(self, parent=None):
		QtGui.QWidget.__init__(self, parent)
		self.ui = Ui_QYolk()
		self.ui.setupUi(self)
		# set the widths of the columns
		self.ui.treeList.setColumnWidth(0,200)
		self.ui.treeList.setColumnWidth(1,100)
		# generator which retuns list of installed packages
		packages = yolklib.Distributions()
		for pkg in packages.get_distributions('all'):
			a = QtGui.QTreeWidgetItem(self.ui.treeList)
			pk = str(pkg[0]).split(' ')
			if pkg[1]:
				status = 'Active'
			else:
				status = 'Not Active'
				a.setTextColor(0, QtGui.QColor(128, 128, 128))
				a.setTextColor(1, QtGui.QColor(128, 128, 128))
				a.setTextColor(2, QtGui.QColor(128, 128, 128))
			a.setText(0, pk[0])
			a.setText(1, pk[1])
			a.setText(2, status)
	
if __name__ == "__main__":
	app = QtGui.QApplication(sys.argv)
	myapp = StartQT4()
	myapp.show()
	sys.exit(app.exec_())
setTextColor(ID Kolumny, QtGui.QColor(R, G, B)) - Gdzie R, G, B to kolor wyrażony w skali RGB, co można podejrzeć w niektórych aplikacjach do obróbki grafiki. U mnie wygląda to tak:
qyolk5

Źródła

Pobierz źródła
RkBlog

14 July 2008;

Comment article