On 1/15/2014 12:33 PM, Chris Angelico wrote:
On Thu, Jan 16, 2014 at 4:02 AM, Sergio Tortosa Benedito
<serto...@gmail.com> wrote:
Hi I'm developing a sort of language extension for writing GUI programs
called guilang, right now it's written in Lua but I'm considreing Python
instead (because it's more tailored to alone applications). My question
it's if I can achieve this declarative-thing in python. Here's an
example:

Window "myWindow" {
         title="Hello world";
         Button "myButton" {
                 label="I'm a button";
                 onClick=exit
         }
}
print(myWindow.myButton.label)

Probably the easiest way to do that would be with dictionaries or
function named arguments. It'd be something like this:

myWindow = Window(
     title="Hello World",
     myButton=Button(
         label="I'm a button",
         onClick=exit
     )
)
print(myWindow.myButton.label)

This is exactly what I was going to suggest.

For this to work, you'd need a Window class that recognizes a number
of keyword arguments (eg for title and other attributes), and then
takes all other keyword arguments and turns them into its children.

I would make the required args positional-or-keyword, with or without a default. Something like (tested)

class Window:
    def __init__(self, title, *kwds)  # or title='Window title'
        self.title = title
        self.__dict__.update(kwds)

class Button:
    def __init__(self, label, **kwds):
        self.label = label
        self.__dict__.update(kwds)

<add Chris' code above>
>>>
I'm a button

Possible, but potentially messy; if you happen to name your button
"icon", it might be misinterpreted as an attempt to set the window's
icon, and cause a very strange and incomprehensible error.

Puns are always a problem with such interfaces. Validate the args as much as possible. An icon should be a bitmap of appropriate size. Optional args should perhaps all be widgets (instances of a Widget baseclass).

--
Terry Jan Reedy

--
https://mail.python.org/mailman/listinfo/python-list

Reply via email to