Tinkering with Tkinter

Video Statistics and Information

Video
Captions Word Cloud
Reddit Comments
Captions
all right good afternoon everybody our last presentation in this session our next presenter is a seven year veteran of the django core team and president of the django software foundation this year he was lead organizer of django con Australia we're not contributing to django his hobbies include asking questions at conferences to speak to us about saying that isn't django please welcome dr. Russel Keith McGee okay so thank you all very much as Ben I said I'm Russell Keith McGee my day job is as CTO and co-founder of trades cloud we're a cloud provider of services software as a service to trades people doing back-office organization stuff for plumbers electricians that sort of thing if you're interested in migrating to Perth we're likely to be hiring soon so come and come and have a chat or if you're already in Perth come and have a chat to me and as Ben I said that's just my day job in my spare time I'm a core developer on the Django project have been since January 2006 president of the Django Software Foundation since 2010 for those who don't know the Django Software Foundation is the IPE legal fundraising arm of the Django project but for a twist Django isn't why I'm here today I'm I got on my django juice out on Friday at the mini conference and I'm here today to introduce you or if you're old enough reintroduce you to a somewhat neglected corner of Python standard library a module called tick hunter why on earth would I want to do such a thing after all to quote the Python wiki Cameron Laird calls the yearly decision to keep TK enter as one of the minor traditions of the Python world that is to say TK entities regularly put on the executioner's block but it's saved at last minute I would like to use this opportunity to mount a defense of TK inter and more than that I'd like to suggest that we should all be using it a lot more than we currently are so what is TK inter alright TK inter is pythons interface to TK what's TK it's the graphics toolkit that came as part of tickle for the youngins in the audience tickle or the tool control language is a scripting language it's a similar sort of vintage to Python itself that was started around 1990 it was very popular in the UNIX world in the 1990s it's raison d'être was to be a common scripting language that you could embed into other UNIX tools and UNIX was just sort of coming into its own because of well the freeing up of BSD and and Linux coming on annex windows was around and still had this idea about sort of a visual basic for UNIX essentially that we could have this common language to control all these tools now as a language it's a bit of a queer odd language but it's it has one very very interesting property every datatype including code could be manipulated as a string and this made it very very easy to integrate with other systems because you only really need to implement a string into a string processing interface to actually get that that binding happening now it's part of its you know it's designed to be easy to integrate so it was an easy to integrate language and essentially that's how tek works as an engine TK can display GUI windows dialogs buttons and so on and tickle into phases with TK using a string layer or using string interface and it's the simplicity of that interface which is what makes it interesting from our perspective as Python as Python developers because there are TK interfaces to Perl to Ruby as well as Python because it is so easy to write an interface you pass strings to the TK engine and windows appear and buttons appear and lo your brand new language has a fully functioning graphics toolkit for building user interfaces so on paper this sounds fantastic why is the Python wiki so unenthusiastic well like all software TK has evolved over time if you're of a similar sort of vintage to myself then your memory of tickle TK is probably something a little bit like this Times New Roman text regardless of what operating system you're on colors that do not even begin to remotely approximate system defaults the very best icons that X BMP icons that money can't buy extremely primitive widget sets you could get buttons and lists but no trees they were all rendered using motif widgets tiles and I don't know if any of you have actually remember using motif essentially everything in motif was a button so you would end up with when you got to things like check boxes it wasn't a box with a checkmark in it until it was on it was a box that would look like it was pressed or a box that wasn't pressed and if you had two of them next to each other and you only had two options you would be hard-pressed to tell which one was on and which one was off and so that was regardless of whether you're on OS X or Windows or gtk or QT or whatever else is your underlying which is it at the API level it had a mind-numbing Lee complex layout API using this this approach called PAC and there's a bright shiny penny to anyone who can actually explain how the hell pack works and to make matters worse the documentation was the usual mid-90s open source standard which is to say they existed so why am I being so bullish on TK inter well two things have changed two very important things have changed the first is TK 8.5 everything if the last time you saw TK inter was was in the 90s or even in the mid to mid nineties TK is not the same anymore in ticket 8.5 came out in December of 2007 and introduced something called TK tile which was a new theming engine which meant that system colors system fonts system widgets now became the default style when you started laying out your is read user interfaces so as a result dialogues look like system native dialogues windows look like system native windows and in the case of the dialogues more often than not they actually are the system native dialogue so when you have a file widget or four Open File widget you're actually using your operating systems open file widget not some weird created thing that T's on some UNIX TK guide that won't be a good idea built-in motif there's also a new layout system called grid which unlike pack makes sense and there's a lot closer to the sort of lay up systems that you'd be familiar with if you've ever done any sort of GUI programming in an API like Java swing or something like that and the widget set is now a lot richer by default it's not perfect there are still some sort of summer missions that I would be useful to have but it definitely covers a lot more of the basics at the very least you have a very good canvas widget you have a very good tree widget that you can now use the second thing that's changed the docs don't suck anymore an unofficial website called TK Doc's as emerged alright someone who actually is a TK fan and it is quite frankly awesome it is both tutorial and reference and the docs don't assume it is literally tech hey Doc's not tickle Doc's about TK so all of the dot all the examples they give are cross language so every example is given in tickle Perl Ruby and Python now the Doc's aren't complete it is a work in progress especially when you get to the reference section but even in their incomplete form they're pretty good and they can give you at least enough of an indication of where in the TK official Docs you might want to look for certain of the at certain other details okay so one does not simply TK inter well yes one does let's walk through an example in this case where I'm actually going to use here the example from TK Doc's itself the first tutorial from TK Doc's it's essentially what we're going to do is build an Imperial to metric feet to meters converter so step one a man a plan cattle palermo sketch out the GUI will want to build we're going to have a single dialog it's going to pop up we're going to have a texting but your input to say X feet is equivalent to Y meters and a big calculate button you press the calculate button and magic happens we then need to sort of look at this and say okay well how can we lay this out what's the sort of the arrangement or alignment structure we want to have inside that well like a let's week and we can divide this into a grid we've got a three by three grid there we've got a line for one widget a line for the second widget a calculate is on the third third line the calculate button can probably sit in the middle of that block the feet and meters we need to stick to that side of the column there in the middle column when the window expands we want the middle column to sort of grow to absorb the additional space we don't we don't mind if that middle column gets bigger but the two to side columns you want to keep about the same size and he is equivalent to we want to stick to that side of the window okay so that grid will form the basis of our layout and actually putting this putting this whole widget to go putting this whole window together so what are we going to do now we're going to open up a a Python shell and start writing some writing some TK code now you can actually do this in a live Python ripple shell and you can watch the window get built up as you're typing these Python come out so this it won't be interactive until you actually say run the event loop but you can build the window and watch it happening so okay we import TK internally input T TK so we've got all the the widget sets the t TK is the extra native styled widget set this code is in python to python 3 there is a subtle change the naming of the the input so again the TK docks are actually in python 3 by default so if you want to see the changes want them down first step we need to initialize our wrote window we create our rigged window TK and we set its title so we now have at the end of this a window with a title on it next step we set up our main frame that root window is essentially an empty a container with nothing in it and by default it doesn't have any style it's just a white window if we want the window to look like a window on our operating system we need to stick into it a frame went to which we can then put additional content so we define ourselves a main frame every wind jet widget has a parent so the frame its parent is the root window and we're going to say okay around the out Soler's around the inside of that frame we want to have some padding north-south-east-west same as you would for HTML or padding we're then going to say ok this main frame is in a grid it's on its route but on the route windows grid and it's going to be in column 0 column 0 row 0 and it's sticky to all four edges so that means that the main route window is a grid of one square and when it expands and contracts this main frame is going to stick to all four sides so essentially this main frame is going to end up being exactly the same size of the root window always and lastly we configure the root windows grid to say column 0 has a weight of 1 row 0 has a weight of 1 what does weight mean it means where does the expansion go when the window when the window grows ok so weight 1 essentially the weights are then distributed if you've got multiple columns the weights are distributed amongst those columns if you've got one column that has twice the weight of another column then when the window expands twice the expansion will happen on that side as will happen on that on the second one we'll see a better example of that in when we start configuring the second grid later on next step we need some input okay so what we're going to do is define a string var which is a darker sort of data placeholder it's like the model in a Model View controller and it's where the view which is the widget itself gets its information from if you change the widget the string var will change and if you change the string var the widget will change we then define ourselves an entry widget which is a TK Tico's version of a simple text field and bind it to the string var and we say okay this this text input is going to have a width of seven so that's you know how many how many characters we all allow this is widget to have bounds to the feet string VAR and we stick it on a grid because we know our original grid position this is going to be in column one row zero so on them in the middle on the first row and it's sticky to the west in the east so it will stick itself to the left and right side of the window as it expands but it won't on the north and south it'll stick in the middle essentially will stay in the middle next we need somewhere to put the results okay so we're going to do the same thing here as we did to cap your input but this time we don't use an entry we just put a label so we're just going to print the output of the of the calculation the label is just a piece of text it's bound to the meters string var so when you change the value of the meter string via the label will change as well and we're going to stick it in column one row one so it's going to be in the middle of our three by three grid that we have on our main window and again it is sticky to the west in the east we then have a bits of decoration and around the outside three other labels these ones aren't bound to text files because we actually just wanted to have a piece of text that says feet or says it's equivalent to or says meters they're stuck in column two row zero so it's the top right square of our grid sticky to the west so it's going to stick to the inside is equivalent to is column zero row one so one row down on the on the left hand side and sticky to the east and meters column twos on the far right on the right hand side one row down sticky to the west and then we do the heavy lifting we say okay we've got a function that actually does our feet too meters calculation now I'm being a little bit lazy here feet yet and meters dot set is manipulating the the feet text var and the meters text bar they are being used here as Global's which is a bit lazy if we were doing this for a serious app and not just a hey let's demo this quickly we would all this stuff would be wrapped up into a broader class and we'd be using self dot feet or self dot meters or we could use func tools dot partial to bind to feet and meters object into the function call the important thing to basically note here though is that calculate is just a function it is a callable and the callable is what is going to get get vote when we hit the Go button we're going to put a button ttk button in the main frame it's button is text we'll say calculate and when it is pressed call calculate call the calculate method when you stick it in the grid bottom right and it's going to be sticky to that site we're also just to make everything nice and easy we're going to bind a keystroke to it as well so when the root window senses that Enter or return has been pressed that will also call the calculate button so regardless of whether you click on the button or you press Enter the calculate methods going to get invoked and at this point we can basically that a rip we do some last little bits of setup we can the the the widget tree has a sort of self reflective property so you can say okay let's have a look at all the children in the mainframe and configure them to have the same amount of padding so an x and y amount of padding going to be on all of them we can specifically say give the feet entry box focus so the cursor is going to be stuck to that window initially and we're going to configure our weights now here we're going to modify the the weight of column one to be one so all of the weight will be stuck to the middle column when you expand the window it means that of your three columns all of the expansion will happen in the middle the outside two columns will basically stay exactly the same width and then you run the main loop and off you go you will have a running application on your desktop that's doing the calculations yep a little thing to note there that is a blocking call okay so your GUI won't repaint unless it's in the main loop sorry your GUI won't repay unless it's actually running through the main loop so if you have an expensive calculation you kind of need to tight you need to slice it up into smaller so that your window will actually real will repaint or you've got to put that operation into a separate thread so that the GUI can actually paint itself that's not particularly unusual in GUI stuff if you've ever done like swing for example and the result you actually get something that on OS X looks like an OS X dialog box it looks like an OS X application okay so there's a whole lot more this is that's a blinding introduction you can go to TK Docs if you want to see a lot more of a tutorial you can see a lot more of a sort of widgets you have access to there's a lot more in the box there are you can you can have all sorts of dialogues using system dialogues there are menus you can interact with your menus and actually make it interact like the video your math menu can be up there there are a whole lot of more a lot more widgets including an extremely rich text widget how rich should you say it takes you about five lines of code to get full syntax highlighting in a text widget there is a really really rich canvas widget as well which is you sort of you drawing drawing boxes and interacting with boxes on a screen or int go with graphics a vector graphics on the screen and if at the end of the day you find that something in Python doesn't exist you can actually get down to the raw TK level you actually have access to the raw bindings to poke what you need to poke and the thing that's worth reiterating here is that it's all in the standard library if you haven't if you have got a Mac you've basically got this sitting there in this in the standard system system Python if you've installed Python from from other library from other other operating systems it's there in the standard library it's a battery that is there in the box for Python 2 and python 3 no dependencies no binary compilation nothing confusing to do there ok so what well I've got a theory and to explain my theory I want to walk down memory lane or at least my memory lane a little bit in 1988 my 4 so my first computer was a Commodore 64 but I really just some way ok here we go I really cut my teeth programming in the late 80s using the ball and sweet so turbo Pascal ball and C++ languages languages like that and there were two very notable properties of these tools they both they had really really fast compilers that sort of how how ball and made us money was with really fast compilers and they had a very distinctive user interface it was an 80 by 25 full-color cursors interface which sounds primitive now but at the time that was cutting-edge it was really pushing the limits of your your CGA four colors monitor and it was really really pushing the hardware in terms of what you could do it was a full IDE in that sense but a really good compiler and a really good interactive debugger search you could see what the hell was going on with your code in about 1994 I discovered UNIX and the good neutral Shane GCC another really fast really good compiler and gdb exists it has almost no user interface at all it is an extraordinarily powerful debugger but almost toxic from a user interface point of view there is one line of context every time you talk write a line of code and incredibly arcane syntax for setting breakpoints into into a piece of code around 2000 it was where I basically started taking Python somewhat seriously and Python took everything it could from the UNIX world under the hood it's got a really powerful debugger pdb is an extraordinarily powerful piece of a piece of piece of kit but it's got the same glistening user interfaces gdb if anything made worse because in order to debug my code I have to deface it what and okay we go through to twenty twenty thirteen i p DB p DB plus plus make things a little bit better they give you a bit of context on the screen pu DB is trying to resurrect a cursor style user interface when PT b exists but you've got to get WX windows working and there's another bright shiny penny for anyone who can get that happening or you have your fully fledged ideas like visual studio or apply charm and languages like that my theory is that Cobblers children have no shoes 25 years after i learnt to program with the cursors based debugger i'm actually telling people as part of professional practice to just put some print statements in to help you debug this and there's n there's all the other things that i'm doing on a daily basis testing profiling coverage things that I wasn't doing 25 years ago but for which I don't have any kind of user interface so over the last 25 years the quality of the development tools especially in the UNIX open source space essentially haven't improved and if anything they've got a little bit despite the river development of retina displays window graphic systems and a deeper understanding of user interface and user experience the effects that a humane Eden user interface can have on productivity we're playing or applying almost none of that to our own tools so why is that some of it I think comes down to a misinterpretation of UNIX philosophy UNIX tells us to do one thing and do it well which is a fine philosophy GCC compiles it just compiles and it does a very good job gdb just D bugs and does a very good job grep and said do just one thing but the UNIX philosophy doesn't say that your user interface has to suck as well if you're dealing with grep and said or even GCC for that matter yes a command line interface probably is the most appropriate user interface or at least one of several appropriate user interfaces why is a single line of text the natural interface for a debugger my theory we can fix this we have the technology or more specifically we have tech enter if you've got Python installed on your laptop you have at your disposal a rich cross-platform set of GUI tools with a clean pythonic interface and better still and this is where I think it really gets powerful if you've got a GUI tool installed in your virtual environment it's it's easy to install as a pip install my tool and that tool will run in your virtual environment you don't have to Splunk around with configuration settings dialogs in your in your IDE to try and work out how your IDE is deciding to run your code in a particular way you just use the same user environment that you're using for everything else now it's not just the theory ah to prove my point I'd like to publicly announce here something that I've been to Kin Turing with for a little while testing anyone might talk at Jango con the other day was a testing was about testing it has been something that I've been passionate about ever since essentially I left University and discovered testing by being thrown headfirst into it at my first job here is the user interface you currently have for testing you run your test suite and you get the lots of little happy dots going along there and I'm running my tests we hear questions for you how long is this test suite going to run for how long's left to run how long did which one of those tests was the slow test when it ran that F that's in there sort of about the fourth line down what was the cause of that the X that's three or three oh I have a better inch along from it what was the cause of that was is there something we need to be worried about The Grates longer skips there is that because I've gotten to install the dependency these tests that have generated warning in the middle of them which test cause that this is not a helpful user interface for running a test so I'd like to introduce cricket cricket is a graphical tool to help you run tests wits it's called cricket why is it called cricket well because Test cricket is a very long game and you need all the help you can to make a variable how do you install it well at k you go and you get open up your virtual environment you say pip install cricket and then you say Python - M cricket Django and it will run your Django unit test suite I will discover your test suite and then well what's in your test suite and then it will let you run it notable features down the left-hand side you've got a tree full of your full test suite it has discovered everything that your normal Django test Runner would discover across the top you've got buttons to run the full suite only the selected tests or the tests that have failed so you can select items in the tree and say I want to run that one that one and that one and that whole test case class along the bottom this test suite is actually running at the moment we've got a progress bar telling us how long how far along progress we are we've got a time estimate about 48 seconds remaining on this a summary of with passed 389 failed 1 1 expected failure skipped 155 tests there's actually two trees there on all tests tree and a problems tree if you tap over to that second tab you'll see the subset of those tests that actually have failed like tests non-default cache this test suite is currently running so I can select the test that has failed and I can see the error trace back for that test whilst the test suite is actually still running I can see from the tree of up there it's a fail big red F it's a red big red item in the tree as well all the greens have passed the Blue has been skipped I can select all those and see the state of the run tests while the test suite is still going so it makes it very very easy to see patterns of failure it's easy to rerun just the fail tests it's easy to rerun just the test from a second module or every second test or run all the tests for disable that one in particular if you double-click on our test entry it'll take it out of the list of tests that are executed so it makes it very easy to run your test wait and see what's going on while your test suite is executing now ok it is early days um it is it does one thing but does one thing very well it runs Jango test Suites it has been released as a version point 1 it at the moment doesn't run on Python 3 it only runs Jango test Suites supporting both the pre 1.6 and 1.6 test discovery modes but it does have a back-end API that would allow you to put in anyone elses test discovery mechanism or anyone elses test running mechanism I have been using this in production for about sort of two to three months at this point just using on a day-to-day basis to deceive line out the edges and see what's to see what's a whether whether my theory actually worked and my experience has been that it's made running my test suite a whole lot easier there are some some crusty edges that still need to be taken out of it but as a principle I think I've demonstrate to myself I've satisfied myself that this can actually work so at this point whether the command line I'm sure there at least two people in the audience it seemed to yell out one of them wants to yell pycharm to say well if you want this risk on user an IDE no yes IDs do have test runners but my experience is that IDs are a different sort of philosophy to building they're about having one great big tool that does everything and they've got to be configured to do in the right way I actually do like the UNIX philosophy what I don't like is the UNIX user interface of everything needs to be done at the command line I like using really rich editors and most ideas that I found don't have rich editors they've got okay editors but not fantastic ones and I'd like to keep using the editor that I like using and I want to be on a pick the test runner that I want to run the other person in the room wants to run something like Python test and yes pilot test does expose a much nicer command-line experience better rendering of exceptions and things like that but again it's still command liner you don't get to see all the stuff that's happening whilst a test suite is running this problem in the room wants to yell Emacs but we'll just ignore them my point here is the UNIX philosophy is right but it doesn't mean we have to be constrained the text console there are good reasons to have command-line tools compilers compilers make sense as command-line tools anything that's fetching and processing like grep orc said curl they make sense as command-line tools and it makes sense to have command-line tools as a fallback when you're operating remotely but this doesn't mean that everything needs to be stuffed into a command-line tool we can have humane user interfaces and humane interfaces for things like test runners debuggers coverage tools profiling tools we can have them cross-platform and we can have them out of the box easily installable into virtual environments so that's my pitch that's my theory and cricket is my attempt to demonstrate the theory isn't completely abstract I'd like to at this point open up for questions does Russell have a question for Russell no sorry Richard and is it on it's on excellent yep excellent I love it do you have any idea of that you said is like back-end stuff for other tests discovery yep so I am a heavy user of noes and I also use it with twisted bits to do my twisted testing it's not pretty yeah um do you have any idea of the effort I'll need to expend to have that being run or if it's possible to run that stuff with cricket okay Shh the I don't know knows well enough to better answer canonically but I suspect not a great deal the the Django wrapper is on the order of about 50 lines of code I think and it's mostly essentially saying you need to have two commands one which X echoes to the command line at the command line level echo echo a string Goddard string version of all the module names that are actually going to be tested that can be identified as targets and then a runner that can take a list of targets and execute them so it's not a huge job I can walk you so I can show you the code for the Django Runner or what codes up the Django Runner its expiry its ort of it does back off a little bit of what Django's test Runner does it sort of it's made easier by Django's test runner cuz django is just runner you potentially what i've done is take it subclass it and say for command a do everything but just don't run the test print them and the second one run all the tests as they're given to so I suspect the answer is not a lot of work I have not actually done it though so you know anything between theory and practice yeah it's a supplementary question yesterday so in the tree Ridge of the side I can like double-click a test just to run that one test I double click like she turn it off but you can click it and say run selected no I have no keyboard bindings on this at the moment okay I I do not profess that it is the best user interface I think they're probably a lot of work that could be done it is the user interface that I've built to test around with it and I'm certainly open to suggestions about whether whether ENTER should be the run binding or the turn off binding or you know whatever I think it's awesome things hi I'm a PI test user but I think I would be super interested in seeing that work with PI test and this might be kind of the same as asking about twisted but do you think that's gonna work ok with tests being farmed out and parallelized in terms of seeing the what do you call it the absolute from it being the interface that and the reason why this actually works as a you know it runs in your virtual environment is essentially what it is is a Python script that starts in your virtual environment that then starts sub processes which inherit the same plasma environment where's the same UNIX environment essentially that then do things and there's there's a there's a pipe back channel which reports this test has passed this test has failed this test has got this warning in it and there's a protocol for passing that information back so as long as your Runner or you can run your tests in such a way that the output to the screen is essentially in a JSON text adjacent strings described in a particular format then you can integrate it it's whether that is easy or hard depends more upon the test tool you're running it with if it if that if you are farming out of somewhere else that shouldn't matter as far as I understand as long as your runner is able to get that information from whatever remotely it's running and pass it back to the GUI through through that back channel thanks for the talk and the turbo Pascal screenshot lots of memories for yes exactly so having written the app now in a modern version of TK into what sort of dark corners or gotchas did you find along the way that we should be aware of and the dark corners that I hit are okay so there there are a couple of refresh issues that it has some interesting refresh behaviors in some places I suspect that is sort of more on the lines of a bug with tkinter rather than actually better bug with TK rather than being an inherent problem with TK as an approach one I mean I can actually show close this out I can bring it over here is a test suite there isn't so for example there isn't a widget for a panel separator or there is but it's kind of it doesn't have a visualization that's there and it does some interesting things with dragging it's now it's not there to go so if you if you drag hard enough you can you can lose it's not going to do it familiy go it's possible to lose the handle which you shouldn't be able to do yes the the biggest one that I hit rovers is literally the same thing you get on any user interface stuff is that your your event loop must do lots and lots of very very small things you can't do anything complicated your event loop and that requires a bit of mental bending but it requires mental bending on any user interface toolkit essentially so you you take your heavy lifting you move it into our separate thread or separate process and then you have a communications back-channel it says turn on the widget and that's all it does the other area is there are some if you hit the edge of if you need a widget that does something that isn't out of the box you kind of have to hit TK natively pretty quickly so I have been tinkering with a graphical debugger as well so this was this was let's prove I can do it in TK at all okay my real goal is I want to build a debugger that's that actually debug his code rather than doing one line at a time and to do that you need a line count rich text widget with syntax highlighting that isn't editable and the rich text widget that TK gives you is editable by default and can't be made uneditable you actually have to get into a fairly low level TK level to eat the editing messages that are coming through it can be done in about 15 lines of TK the secret is finding the 15 lines DK and I'm not enough of a TK expert yet to make that sort of really natural so that would be probably the only two things I really flag there Thanks let's just good today yeah well the last time I used to quartic hours back in 1996 and I well I actually enjoyed the pack layout oh okay okay so you can explain it to me cellophane had to be great I can't actually remember but I just remember back at the time it kind of fit my mind well and that says about me but oh the context the question I was going to ask is how did you find TK as just a general API I mean my memory of that was that it had just a very low kind of mental overhead to sort of get things done yeah okay so you think hey yeah so TK I can't really comment because I've only really been using it through TK inter but it is a very it is a very pythonic interface in the sense that you know what you've got a button I want to put a button on the screen I want to put it there I want to put in there in a grid and when you press it call this function that's what I want my interface to be like you know yeah and like I said you can do that in a ripple shell and just bind the Korbel in to the method and if it goes so yeah it was a very natural interface to get into so yeah I have quite enjoyed you see and I've done plenty of GUI programming in the past with swing and a QT and stuff like that and this is probably the fastest UI code I've ever been able to just get off the ground with a running product by virtue of it being in a language I like that you can rapidly turnaround you know etc so really simple one visual designer hey yeah I don't have one I as well once sorry does one exists for T gained I TK into I don't know I think there are some 40k but I'm not sure not that I've just not not that I've actually actually actively gone looking for certainly would be interesting seeing if there was one and you know that in itself would be an interesting TK project to sort of met oh right if there isn't one so is it like a active state Komodo has one apparently so
Info
Channel: PyCon AU
Views: 37,663
Rating: undefined out of 5
Keywords: pyconau, pycon_au_2013, Python, PyCon, RussellKeith-Magee
Id: yI7NYgP54sw
Channel Id: undefined
Length: 35min 3sec (2103 seconds)
Published: Wed Jul 10 2013
Related Videos
Note
Please note that this website is currently a work in progress! Lots of interesting data and statistics to come.