It is written in Python3 and is using Gtk3 for the gui. The packaging actions is done by two yum DBus services there is doing all the yum actions. This should make it easier to migrate to DNF or some other packaging backend in the future.
I made a prototype a while ago, but was not satisfied by the look and feel, so I started from scratch again, and started to research on the latest development in Python3/GTK3/PyGObject.
I found some good information resources on these sites
- The Python GTK+ 3 Tutorial
- Tutorials, code samples and platform demos in Python
- PyGObject - GLib/GObject/GIO Python bindings
- GTK+ 3 Reference Manual
But something like how to handle the command line from at Gtk.Application was hard to find, so I have made a little example Hello world application, show the basics of a Python Gtk3 Application with command line handling.
I
#!/usr/bin/python3 -tt # -*- coding: utf-8 -*- # # Python3 and Gtk3 (via PyGOject) simple demo app by Tim Lauridsen # # It shows the basic elements of a Gtk.Application & Gtk.ApplicationWindow based application in python # it also shows how to handle command line arguments. # # Python import import sys import argparse # python3-gobject import from gi.repository import Gtk from gi.repository import Gio from gi.repository import Gdk class MyWindow(Gtk.ApplicationWindow): """ Main Application Window """ def __init__(self, app): Gtk.Window.__init__(self, title="Gui Test", application=app) self.args = app.args # store the args from the application object self.set_default_size(400, 400) # set the windows initial size self.cnt = 0 # buttom clicked counter # create a Grid layout self.grid = Gtk.Grid() self.grid.set_column_spacing (5) # create a button and attact it to the grid button = Gtk.Button("Hallo World") self.grid.attach(button, 0, 0, 1, 1) button.connect("clicked",self.on_button,"custom data") # Add a label to the right of the button self.label = Gtk.Label("") self.label.set_width_chars(50) # set the label width in chars self.label.set_alignment(0.02,0.5) # set the (x.y) alignment of the label self.grid.attach_next_to(self.label, button, Gtk.PositionType.RIGHT, 1, 1) self.grid.show_all() # make all widgets in grid visible # add Grid to window self.add(self.grid) # callback for "button" def on_button(self, widget, data): self.cnt += 1 self.label.set_text("Button Clicked : %d" % self.cnt) # change label background color, just for the fun of it if self.args.color: if self.cnt % 2 == 0: self.label.override_background_color (Gtk.StateFlags.NORMAL, Gdk.RGBA(255, 0, 0, 1)) else: self.label.override_background_color (Gtk.StateFlags.NORMAL, None) class MyApplication(Gtk.Application): ''' Main application class ''' def __init__(self): # init the parent class # the Gio.ApplicationFlags.HANDLES_COMMAND_LINE flags tells that # we want to handle the command line and do_command_line will be called Gtk.Application.__init__(self,flags=Gio.ApplicationFlags.HANDLES_COMMAND_LINE) self.args = None # store for parsed command line options def do_activate(self): ''' Gtk.Application activate handler ''' # create our main window self.win = MyWindow(self) # connect a delete_event handler ((riggered by clicking on the windows close button) self.win.connect('delete_event', self.on_quit) # show the window self.win.show() def do_startup(self): ''' Gtk.Application startup handler ''' Gtk.Application.do_startup(self) def do_command_line(self, args): ''' Gtk.Application command line handler called if Gio.ApplicationFlags.HANDLES_COMMAND_LINE is set. must call the self.do_activate() to get the application up and running. ''' Gtk.Application.do_command_line(self, args) # call the default commandline handler # make a command line parser parser = argparse.ArgumentParser(prog='gui') # add a -c/--color option parser.add_argument('-c', '--color', action='store_true') # parse the command line stored in args, but skip the first element (the filename) self.args = parser.parse_args(args.get_arguments()[1:]) # call the main program do_activate() to start up the app self.do_activate() return 0 def do_shutdown(self): ''' Gtk.Application shutdown handler Do clean up before the application is closed. this is triggered when self.quit() is called. ''' Gtk.Application.do_shutdown(self) def on_quit(self, widget, data): ''' custom quit handler ''' self.quit() # quit the application if __name__ == '__main__': # make an application object app = MyApplication() # run the application exit_status = app.run(sys.argv) # exit with return code sys.exit(exit_status)
0 comments:
Post a Comment