April 2024 - This site, and Kamaelia are being updated. There is significant work needed, and PRs are welcome.

Kamaelia.UI.Tk.TkWindow

Simple Tk Window base class

A simple component providing a framework for having a Tk window as a component.

TkInvisibleWindow is a simple implementation of an invisible (hidden) Tk window, useful if you want none of the visible windows to be the Tk root window.

Example Usage

Three Tk windows, one with "Hello world" written in it::
class MyWindow(TkWindow):
def __init__(self, title, text):
self.title = title self.text = text super(MyWindow,self).__init__()
def setupWindow(self):

self.label = Tkinter.Label(self.window, text=self.text)

self.window.title(self.title)

self.label.grid(row=0, column=0, sticky=Tkinter.N+Tkinter.E+Tkinter.W+Tkinter.S) self.window.rowconfigure(0, weight=1) self.window.columnconfigure(0, weight=1)

root = TkWindow().activate() # first window created is the root win2 = MyWindow("MyWindow","Hello world!").activate()

scheduler.run.runThreads(slowmo=0)

How does it work?

This component provides basic integration for Tk. It creates and sets up a Tk window widget, and then provides a kamaelia main loop that ensures Tk's own event processing loop is regularly called.

self.window contains the Tk window widget.

To set up your own widgets and event handling bindings for the window, reimplement the setupWindow() method.

NOTE: Do not bind the "<Destroy>" event as this is already handled. Instead, reimplement the destroyHandler() method. This is guaranteed to only be called if the destroy event is for this specific window.

The first window instantiated is the Tk "root" window. Note that closing this window will result in Tk trying to close down. To avoid this style of behaviour, create a TkInvisibleWindow as the root.

The existing main() method ensures Tk's event processing loop is regularly called.

You can reimplement main(). However, you must ensure you include the existing functionality: - regularly calling tkupdate() to ensure Tk gets to process its own events - calls self.window.destroy() method to destroy the window upon shutdown. - finishes if self.isDestroyed() returns True

The existing main() method will cause the component to terminate if a producerFinished or shutdownMicroprocess message is received on the "control" inbox. It sends the message on out of the "signal" outbox and calls self.window.destroy() to ensure the window is destroyed.

NOTE: main() must not ask to be paused as it calls the Tk event loop. If the Tk event loop is not called, then a Tk app will freeze and be unable to respond to events.

NOTE: Event bindings are called from within Tk event handling. If, for example, there are two (or more) TkWindow instances, then a given event handler could be called whilst the thread of execution is actually within the other TkWindow component's main() method. This is a bit messy. It will not cause problems in a single threaded system, but may be an issue once Axon/Kamaelia is able to distribute across multiple processors.

Development History

Started as a first hash attempt at some components to incorporate Tkinter into Kamaelia in cvs:/Sketches/tk/tkInterComponents.py

Turned out to be remarkably resilient so far, so migrated into the main codebase.


Kamaelia.UI.Tk.TkWindow.TkWindow

class TkWindow(Axon.Component.component)

TkWindow() -> new TkWindow component

A component providing a Tk window. The first TkWindow created will be the "root" window.

Subclass to implement your own widgets and functionality on the window.

Inboxes

Outboxes

Methods defined here

Warning!

You should be using the inbox/outbox interface, not these methods (except construction). This documentation is designed as a roadmap as to their functionalilty for maintainers and new component developers.

__destroyHandler(self, event)

Handler for destroy event. Do not override.

__init__(self)

x.__init__(...) initializes x; see x.__class__.__doc__ for signature

destroyHandler(self, event)

Stub method. Reimplement with your own functionality to respond to a tk window destroy event.

isDestroyed(self)

Returns true if this window has been destroyed

main(self)

Main loop. Stub method, reimplement with your own functionality.

Must regularly call self.tkupdate() to ensure tk event processing happens.

setupWindow(self)

Populate the window with widgets, set its title, set up event bindings etc...

Do not bind the "<Destroy>" event, as this is already handled.

Stub method. Reimplement with your own functionality.

tkupdate(self)

Calls tk's event processing loop (if this is the root window).

To be called from within self.main().

Kamaelia.UI.Tk.TkWindow.tkInvisibleWindow

class tkInvisibleWindow(TkWindow)

tkInvisibleWindow() -> new tkInvisibleWindow component.

An invisible, empty tk window. Can use as a 'root' window, thereby ensuring closing any (visible) window doesn't terminate Tk (closing the root does).

Inboxes

Outboxes

Methods defined here

Warning!

You should be using the inbox/outbox interface, not these methods (except construction). This documentation is designed as a roadmap as to their functionalilty for maintainers and new component developers.

setupWindow(self)

Sets up and hides the window.

Methods inherited from Kamaelia.UI.Tk.TkWindow.TkWindow :

Feedback

Got a problem with the documentation? Something unclear that could be clearer? Want to help improve it? Constructive criticism is very welcome - especially if you can suggest a better rewording!

Please leave you feedback here in reply to the documentation thread in the Kamaelia blog.

-- Automatic documentation generator, 05 Jun 2009 at 03:01:38 UTC/GMT