PyQtWebKit

23:01 < Riddell> anyone want to learn a bit of pyqt?
23:02 < Sundance> Riddell: Is this going to be about PyQt, or Plasmoids in Python specifically?
23:02 < Riddell> this was advertised as a plasma with python talk
23:02 < Riddell> I'm afraid that's not going to happen today
23:02 < Riddell> it seems plasma with python is ready yet
23:02 < Riddell> sorry about that
23:02 < Riddell> the work is going on in http://websvn.kde.org/trunk/playground/base/plasma/scriptengines/kross/ if you want to follow it
23:02 < dwidmann> Riddell: missing a not in that last setence, I presume?
23:03 < Riddell> dwidmann: right
23:03 < Riddell> maybe someone will have better luck than us at getting those example to work
23:03 < Riddell> HappySmileMan: it doesn't work reliably yet and it's not documented
23:03 < Riddell> however it should be possible soon
23:04 < Riddell> and we'll do a tutorial when that happens
23:04 < Riddell> so I thought we'd make a web browser in pyqt instead
23:04 < Riddell> supert0nes: yep
23:04 < Riddell> this needs Qt 4.4 and the same version of python-qt4
23:04 < Riddell> add this to /etc/apt/sources.list
23:04 < Riddell> deb http://ppa.launchpad.net/kubuntu-members-kde4/ubuntu hardy main
23:05 < Riddell> apt-get update
23:05 < Riddell> apt-get install libqt4-webkit python-qt4
23:06 < Riddell> so our first revision goes like this
23:06 < Riddell> #!/usr/bin/env python
23:06 < Riddell> because it's python
23:06 < Riddell> import sys
23:06 < Riddell> from PyQt4.QtCore import *
23:06 < Riddell> from PyQt4.QtGui import *
23:06 < Riddell> from PyQt4.QtWebKit import *
23:06 < Riddell> to load up the libraries
23:07 < Riddell> python's inbuilt sys library and the necessary parts of Qt
23:07 < Riddell> app = QApplication(sys.argv)
23:07 < Riddell> that create the vital application object which does lots of work behind the scenes to create a running application
23:07 < Riddell> web = QWebView()
23:07 < Riddell> web.load(QUrl("http://kubuntu.org"))
23:07 < Riddell> web.show()
23:07 < Riddell> here we create the web browser widget
23:07 < Riddell> Qt 4.4 has WebKit built into it
23:08 < Riddell> so a web browser widget is easy to add
23:08 < Riddell> sys.exit(app.exec_())
23:08 < Riddell> that's the final line
23:08 < Riddell> app.exec_() runs it
23:08 < Riddell> and when that method returns it'll quit the app with the appropriate exit code
23:09 < Riddell> the full thing is at the address above
23:09 < Riddell> has anyone got it working?
23:09 < Riddell> nosrednaekim?
23:09 < Riddell> yay!
23:10 < Riddell> it should look like this http://kubuntu.org/~jriddell/tutorials-day/webkit/web1.png
23:10 < Riddell> just a window with the webview widget in it
23:10 < Riddell> any questions?
23:11 < Sundance> Riddell: What HTTP features does QUrl support? Cookies? Cache?
23:11 < nosrednaekim> Riddell: unfortunately I had to update my qt4 packages which is taking forever on the PPA
23:11 < Riddell> Sundance: QUrl just holds the url, QtWebKit library does all the fancy stuff
23:11 < Riddell> Sundance: I believe it does cookies and caching and ssl and all that
23:12 < Riddell> Sundance: but it's also possible to replace those methods with your own
23:12 < Riddell> Sundance: so webkitkde uses the QtWebKit library but replaces cookies and fetching with http with the KDE ways of doing those
23:13 < Riddell> supert0nes: yes in a simple case like this, of course you can set up widgets later if you need to 
23:13 < Riddell> but a web browser needs an address bar
23:13 < Riddell> so lets add one
23:13 < Riddell> the widget for that is Qt's QLineEdit which is a pretty common widget
23:13 < Riddell> ah but it also needs a parent widget
23:14 < Riddell> which has a layout two hold the two widgets we care about (lineedit and webview)
23:14 < Riddell> widget = QWidget()
23:14 < Riddell> creates the parent widget
23:14 < Riddell> layout = QVBoxLayout(widget)
23:14 < Riddell> give it a layout
23:14 < Riddell> web = QWebView(widget)
23:14 < Riddell> web.load(QUrl("http://kubuntu.org"))
23:14 < Riddell> layout.addWidget(web)
23:14 < Riddell> widget.show()
23:14 < Riddell> put our webview widget into the layout
23:14 < Riddell> code is at http://kubuntu.org/~jriddell/tutorials-day/webkit/web2.py
23:15 < Riddell> the result is much the same as before
23:15 < Riddell> but there's a border there which is caused by the layout
23:15 < fliegenderfrosch> Riddell: is there a problem if I install the packages from the PPA when I've already installed PyQt4.4 using "make install"?
23:16 < Riddell> fliegenderfrosch: if you already have pyqt 4.4 you shouldn't need the packages
23:16 < Riddell> fliegenderfrosch: but it shouldn't be a problem, it might overwrite your own compile if it's installed to /usr
23:17 < fliegenderfrosch> Riddell: I have pyqt 4.4 but I get an error about not having webkit (libqt4-webkit is installed)
23:17 < Riddell> removing the border is an exercise you can try, it needs the layout to have its margins set
23:17 < Riddell> the qt documentation is very extensive so it should be easy to work out how to do that http://doc.trolltech.com/4.4/qlayout.html
23:17 < Riddell> fliegenderfrosch: try installing the ppa packages then
23:17 < fliegenderfrosch> Riddell: ok, thanks
23:18 < Riddell> so http://kubuntu.org/~jriddell/tutorials-day/webkit/web2.png is where we're at
23:18 < Riddell> adding the address bar is easy peasy
23:18 < Riddell> addressBar = QLineEdit(widget)
23:18 < Riddell> layout.addWidget(addressBar)
23:18 < Riddell> which gives us something like this http://kubuntu.org/~jriddell/tutorials-day/webkit/web3.png
23:19 < Riddell> full code is at http://kubuntu.org/~jriddell/tutorials-day/webkit/web3.py
23:19 < Riddell> anyone got it working?
23:20 < Riddell> dwidmann: working for you?
23:21 < Riddell> not so long ago getting an app to show a web page was the tricky part :)
23:21 < Riddell> next we need to connect our address bar to send its text to the webview widget
23:21 < Riddell> so we can load web pages that we want
23:22 < Riddell> for this we need to create a method we can call
23:22 < Riddell> which will grab the text out of the address bar and tell the webview to load it
23:22 < Riddell> def loadUrl(): print "Loading " + addressBar.text() web.load( QUrl(addressBar.text()) )
23:23 < Riddell> hmm, that should be on multiple lines
23:23 < Riddell> def loadUrl():
23:23 < Riddell>   print "Loading " + addressBar.text()
23:23 < Riddell>   web.load( QUrl(addressBar.text()) )
23:23 < Riddell> here we define a method called loadUrl()
23:23 < Riddell> it has a debugging line so we can see what's going on at the command line
23:24 < Riddell> and it calls the webview widget with the text converted into a QUrl
23:24 < Riddell> then we need to add a signal/slot connection to run that method
23:24 < Riddell> signals happen in Qt widgets when something interesting happens
23:24 < Riddell> and you connect them to slots (which in pyqt are just methods, like the one above)
23:25 < Riddell> QObject.connect(addressBar, SIGNAL("returnPressed()"), loadUrl)
23:25 < Riddell> I looked up the lineedit documentation http://doc.trolltech.com/4.4/qlineedit.html
23:25 < Riddell> saw it had just the signal we needed, returnPressed()
23:25 < Riddell> and so we connect it to our method
23:26 < Riddell> full program is at http://kubuntu.org/~jriddell/tutorials-day/webkit/web4.py
23:26 < Riddell> it looks just like the web3 version, but if you type in a url and press return it'll load that website
23:26 < Riddell> http://kubuntu.org/~jriddell/tutorials-day/webkit/web4.png
23:26 < Riddell> mackand: pastebin    apt-cache policy python-qt4
23:28 < Riddell> who's got it working?
23:29 < Riddell> dwidmann: addressBar = QLineEdit(widget)
23:29 < Riddell> dwidmann: passing "widget" when creating that should make it parent to the "widget" we created
23:30 < Riddell> supert0nes: right, QUrl will only accept valid URLs
23:30 < Riddell> as an exercise, it wouldn't be hard to improve loadUrl() to add http if that's missing
23:30 < Riddell> dwidmann: you also create a layout for widget?
23:31 < Riddell> dwidmann: and add addressBar to that layout?
23:32 < Riddell> supert0nes: in most cases you don't need to
23:32 < Riddell> in most cases you'll create your own class which can have its methods in any order
23:32 < Riddell> that's a more common programme structure
23:33 < Riddell> (a class, if you don't know object orientated programming, is a collection of methods and variables from which you create objects.  it can itself be based on another class)
23:33 < Riddell> http://kubuntu.org/~jriddell/tutorials-day/webkit/web5.py  that shows the same programme
23:33 < Riddell> but in a different structure
23:34 < Riddell> it defines a class which is (inherits) a the basic QWidget class
23:34 < Riddell> and adds its own children (the addressBar and web widgets)
23:35 < Riddell> when creating a class you use self.foo to create variables that belong to the class
23:35 < Riddell> and you pass self into any methods
23:35 < Riddell> fliegenderfrosch: doh!
23:35 < Riddell> dwidmann: ah hah
23:36 < Riddell> supert0nes: I'm afraid I didn't have time to create this in qt designer
23:36 < Riddell> but if you are making a user interface which is at all complex, I recomment making it in designer
23:38 < Riddell> HappySmileMan: I've never seen the point in that, just seems like something extra to learn that if statements can do just as well
23:38 < Riddell> looking at the signals given out by QWebView it would be easy to add a loading animation 
23:38 < Riddell> http://doc.trolltech.com/4.4/qwebview.html
23:39 < Riddell> just use loadStarted() and loadFinished()
23:39 < Riddell> inface you could use loadProgress(int) fed into a progressBar
23:39 < Riddell> infact..
23:39 < Riddell> we use python a lot in Kubuntu and Ubuntu generally
23:39 < Riddell> it's popular, well supported by Qt and KDE and other libraries
23:39 < Riddell> easy to learn and easy to write
23:40 < Riddell> supert0nes: yet, Ruby is a good choice too
23:40 < Riddell> s/yet/yes/
23:40 < Riddell> we happen to use python in the ubuntu world, but ruby is certainly good as well
23:41 < Riddell> KDE 4.1 will also see the first pyKDE app in KDE!
23:41 < Riddell> which is the printer-applet from Kubuntu
23:42 < Riddell> also guidance-power-manager is in KDE extragear for 4.1
23:42 < Riddell> it's very satisfying to be able to contribute to KDE through Kubuntu
23:42 < Riddell> HappySmileMan: grenius!
23:43 < Riddell> last tutorials day I gave a similar tutorial and nosrednaekim hang around and wrote us a compiz installer/config tool for Kubuntu
23:43 < Riddell> yay nosrednaekim!
23:43 < nosrednaekim> Riddell: which I need to work on :P
23:43 < Riddell> so if you're inspired to help out Kubuntu with pykde hang around on this channel and ask what needs done
23:43 < Riddell> (many things are listed at https://wiki.kubuntu.org/Kubuntu/Todo)
23:45 < Riddell> well
23:45 < Riddell> yes and no
23:45 < Riddell> it's developed by Jim who puts it on riverbankcomputing
23:45 < Riddell> but then Sime grabs that and puts it in KDE's kdebindings module
23:46 < Riddell> we're using the version from kdebindings now since Sime works super hard to keep it up to date with the KDE version
23:46 < Riddell> supert0nes: plasma bindings are separate again
23:46 < Riddell> they use Kross
23:46 < Riddell> which is a nifty library originally for KOffice that lets apps gain scriptable ability easily
23:47 < Sundance> Riddell: For instance, if we had a mind to help with getting the Plasma bindings done, where should we turn to? I prodded the Seigo Man 'bout that a while ago, but didn't press the matter since he's always so busy running all over the world, spreading love and awesomeness. :)
23:47 < Riddell> so if you want to add a formula to KSpread you can easily do it in python and not have to worry about compiling
23:47 < Riddell> the plasma Kross plugin is being developed in http://websvn.kde.org/trunk/playground/base/plasma/scriptengines/kross/
23:48 < Riddell> and the developer did assure me it worked, but I'm afraid I couldn't get it to do much
23:48 < Riddell> but do try it out yourself
23:48 < Riddell> you'll probably need an svn compile of kdebase for the latest plasma
23:49 < Sundance> Riddell: Didn't install last time I checked, and I couldn't find the documentation to figure it out. :/
23:58 < fliegenderfrosch> Riddell: why do you let Browser inherit QWidget and not QDialog?
23:58 -!- jr_ is now known as Riddelll
23:58 < Riddelll> hmm, so my server has decided to break
23:58 < Riddelll> if you look in http://websvn.kde.org/trunk/playground/base/plasma/scriptengines/kross/examples/  you'll see there's a few different types of plasma plugins
23:58 < Riddelll> the runner ones add features to the alt-F2 krunner dialogue
23:58 < nosrednaekim> Riddelll: ahhhh I was lookin for that forever the other day :P
23:58 < Riddelll> the dataengine ones provide the data without a UI, such as an interface into the power manager
23:58 < Riddelll> and the applet gives the plasmoid UI we all know and love
23:58 < Riddelll> if you want more examples of pyqt and pykde apps you can apt-get source python-qt4 which has a bunch of examples
23:58 < Riddelll> for something more complex look at printer-applet in kdeutils in KDE's svn
23:58 < Riddelll> or guidance-power-manager in extragear/utils in KDE's svn
23:58 < Riddelll> Sundance: what is it?
23:58 < supert0nes> gotta head out but thanks very much Riddelll, you have given me the kickstart necessary on PyQt
23:58 < Riddelll> oh and if you're looking for a way to contribute back
23:58 < Riddelll> techbase.kde.org needs pykde tutorials
23:58 < Riddelll> so you could convert this web browser to a pykde app
23:58 < Riddelll> and put it on techbase
23:58 < fliegenderfrosch> Riddelll: What does pykde provide (on top of pyqt)?
23:58 < Sundance> Riddelll: Just a small MU* client. Nothing spectacular, except that I try to mind the clarity of my code a lot.
23:58 < Riddelll> fliegenderfrosch: better integration with KDE
23:58 < Riddelll> it'll pick up the right KDE widget style, and you can use KDE icons
23:58 < Riddelll> it works with KDE translations too, which are much nicer than Qt's
23:58 < Riddelll> here's a basic pyKDE app   http://kubuntu.org/~jriddell/tutorials-day/python/hola2-kde.py
23:58 < fliegenderfrosch> Riddelll: nice, i've got to look at that for my pyqt apps. and with kde4, you don't even lose windows/osx compatibility, right?
23:58 < Riddelll> fliegenderfrosch: shouldn't do, although I'm not sure if pykde is working on windows/mac yet
23:59 < fliegenderfrosch> Riddelll: that doesn't matter, my programs are not even ready for linux users yet...
23:59 < Riddelll> ok, time up, it would be great if someone did turn this into a tutorial on techbase, let me know if you want to do that
00:00 < Riddelll> txwikinger: ready in a minute?