Mercurial > hg > pub > prymula > scripts
diff postagelabels/postagelabels.py @ 0:dcd610585610
INIT
author | prymula <prymula76@outlook.com> |
---|---|
date | Thu, 21 Sep 2023 22:32:14 +0200 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/postagelabels/postagelabels.py Thu Sep 21 22:32:14 2023 +0200 @@ -0,0 +1,1012 @@ +#!/usr/bin/env python3 +# Postage Labels - aplikacja do aranżacji wydruków etykiet pocztowych +# autor: Przemysław R. Pietraszczyk +# licencja: GPL +# data 20-IX-2021 +# edytor: Geany + +import sys +import cairo +import gi, os +gi.require_version("Gtk", "3.0") +from gi.repository import Gtk, GdkPixbuf, Gdk +from gi.repository.GdkPixbuf import Pixbuf + + +UI_INFO = """ +<ui> + <menubar name='MenuBar'> + <menu action='FileMenu'> + <menu action='FileLoad'> + <menuitem action='NewTemplate' /> + <menuitem action='LoadImg' /> + <menuitem action='Composite' /> + </menu> + <menuitem action='FilePrint' /> + <separator /> + <menuitem action='FileQuit' /> + </menu> + <menu action='InfoMenu'> + <menuitem action='Help'/> + <menuitem action='About'/> + </menu> + </menubar> + +</ui> +""" + +grid = Gtk.Grid() +file_img_selected="" +file_label_save="" +new_pixbuf="" +list_labels = [] +label_limits = [] +print_limits = [] +#label_selected = "" +BLANK_W = 1134 +BLANK_H = 496 + + +def get_resource_path(rel_path): + dir_of_py_file = os.path.dirname(__file__) + rel_path_to_resource = os.path.join(dir_of_py_file, rel_path) + abs_path_to_resource = os.path.abspath(rel_path_to_resource) + return abs_path_to_resource + +class DialogCompositor(Gtk.Dialog): + def __init__(self, parent): + global new_pixbuf + Gtk.Dialog.__init__(self, title="Kompozytor", transient_for=parent, flags=0) + self.props.border_width = 20 + self.add_buttons( + Gtk.STOCK_CANCEL, + Gtk.ResponseType.CANCEL, + Gtk.STOCK_SAVE, + Gtk.ResponseType.OK, + ) + self.compos = Gtk.Grid() + file_img_composite=get_resource_path("/usr/share/postagelabels/blank_small.png") + new_pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_scale( + filename=file_img_composite, + width=500, + height=250, + preserve_aspect_ratio=True) + + self.add(self.compos) + + self.compos.set_row_spacing(10) + self.compos.set_column_spacing(10) + #self.compos.set_column_homogeneous(True) # rozszerza kontrolke na resztę okna + + # potrzebne do wyśwetlenia tekstu + self.surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, new_pixbuf.get_width(), new_pixbuf.get_height()) + self.context = cairo.Context(self.surface) + + Gdk.cairo_set_source_pixbuf(self.context, new_pixbuf, 0, 0) + self.context.paint() #paint the pixbuf + + self.fontsize= 25 + + box = self.get_content_area() + + self.com_first = Gtk.Image.new_from_pixbuf(new_pixbuf) + self.compos.attach(self.com_first,0,0,1,3) + + + self.entry1 = Gtk.Entry() + self.entry1.set_text("Hello World") + self.compos.attach(self.entry1,1,0,1,1) + + + self.entry2 = Gtk.Entry() + self.entry2.set_text("Hello World") + self.compos.attach(self.entry2,1,1,1,1) + + self.entry3 = Gtk.Entry() + self.entry3.set_text("Hello World") + self.compos.attach(self.entry3,1,2,1,1) + + self.entry4 = Gtk.Entry() + self.entry4.set_text("Hello World") + self.compos.attach(self.entry4,1,3,1,1) + + button1 = Gtk.Button.new_with_label("Aktualizuj") + button1.connect("clicked", self.actualization1) + self.compos.attach(button1,2,0,1,1) + + button2 = Gtk.Button.new_with_label("Aktualizuj") + button2.connect("clicked", self.actualization2) + self.compos.attach(button2,2,1,1,1) + + button3 = Gtk.Button.new_with_label("Aktualizuj") + button3.connect("clicked", self.actualization3) + self.compos.attach(button3,2,2,1,1) + + button4 = Gtk.Button.new_with_label("Aktualizuj") + button4.connect("clicked", self.actualization4) + self.compos.attach(button4,2,3,1,1) + + + button_clear = Gtk.Button.new_with_label("Wyczyść") + button_clear.connect("clicked", self.entry_clear) + self.compos.attach(button_clear,3,0,1,4) + box.add(self.compos) + + self.show_all() + + def entry_clear(self, button): + global new_pixbuf + file_img_selected=get_resource_path("/usr/share/postagelabels/blank_small.png") + new_pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_scale( + filename=file_img_selected, + width=500, + height=250, + preserve_aspect_ratio=True) + + + if self.com_first != None: + self.compos.remove(self.com_first) + self.com_first=None + else: + self.compos.remove(self.com_new) + + # czyści etykiete + self.surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, new_pixbuf.get_width(), new_pixbuf.get_height()) + self.context = cairo.Context(self.surface) + Gdk.cairo_set_source_pixbuf(self.context, new_pixbuf, 0, 0) + self.context.paint() #paint the pixbuf + + + self.com_new = Gtk.Image.new_from_pixbuf(new_pixbuf) + self.compos.attach(self.com_new,0,0,1,3) + + self.show_all() + + + def actualization1(self, button): + global new_pixbuf + self.context.move_to(15, 20+self.fontsize) + self.context.set_font_size(self.fontsize) + self.context.set_source_rgba(0,0,0,1) + self.context.show_text(self.entry1.get_text()) + + #get the resulting pixbuf + self.surface= self.context.get_target() + new_pixbuf= Gdk.pixbuf_get_from_surface(self.surface, 0, 0, self.surface.get_width(), self.surface.get_height()) + + if self.com_first != None: + self.compos.remove(self.com_first) + self.com_first=None + else: + self.compos.remove(self.com_new) + + + self.com_new = Gtk.Image.new_from_pixbuf(new_pixbuf) + self.compos.attach(self.com_new,0,0,1,3) + + self.show_all() + + def actualization2(self, button): + global new_pixbuf + self.context.move_to(15, 20+self.fontsize+self.fontsize+15) + self.context.set_font_size(self.fontsize) + self.context.set_source_rgba(0,0,0,1) + self.context.show_text(self.entry2.get_text()) + + #get the resulting pixbuf + self.surface= self.context.get_target() + new_pixbuf= Gdk.pixbuf_get_from_surface(self.surface, 0, 0, self.surface.get_width(), self.surface.get_height()) + + if self.com_first != None: + self.compos.remove(self.com_first) + self.com_first=None + else: + self.compos.remove(self.com_new) + + + self.com_new = Gtk.Image.new_from_pixbuf(new_pixbuf) + self.compos.attach(self.com_new,0,0,1,3) + + self.show_all() + def actualization3(self, button): + global new_pixbuf + self.context.move_to(15, 20+self.fontsize+self.fontsize+self.fontsize+30) + self.context.set_font_size(self.fontsize) + self.context.set_source_rgba(0,0,0,1) + self.context.show_text(self.entry3.get_text()) + + #get the resulting pixbuf + self.surface= self.context.get_target() + new_pixbuf= Gdk.pixbuf_get_from_surface(self.surface, 0, 0, self.surface.get_width(), self.surface.get_height()) + + if self.com_first != None: + self.compos.remove(self.com_first) + self.com_first=None + else: + self.compos.remove(self.com_new) + + + self.com_new = Gtk.Image.new_from_pixbuf(new_pixbuf) + self.compos.attach(self.com_new,0,0,1,3) + + self.show_all() + + def actualization4(self, button): + global new_pixbuf + self.context.move_to(15, 20+self.fontsize+self.fontsize+self.fontsize+self.fontsize+50) + self.context.set_font_size(self.fontsize) + self.context.set_source_rgba(0,0,0,1) + self.context.show_text(self.entry4.get_text()) + + #get the resulting pixbuf + self.surface= self.context.get_target() + new_pixbuf= Gdk.pixbuf_get_from_surface(self.surface, 0, 0, self.surface.get_width(), self.surface.get_height()) + + if self.com_first != None: + self.compos.remove(self.com_first) + self.com_first=None + else: + self.compos.remove(self.com_new) + + + self.com_new = Gtk.Image.new_from_pixbuf(new_pixbuf) + self.compos.attach(self.com_new,0,0,1,3) + + self.show_all() + + +class DialogHelp(Gtk.Dialog): + def __init__(self, parent): + Gtk.Dialog.__init__(self, title="Pomoc", transient_for=parent, flags=0) + self.props.border_width = 20 + self.add_buttons( + Gtk.STOCK_OK, Gtk.ResponseType.OK + ) + + self.set_default_size(150, 100) + label1 = Gtk.Label(label="Aplikacja służąca do aranżacji wydruku etykiet pocztowych.\nMożna zrówno tworzyć jak i wczytywać gotowe etykiety,\n a następnie umieszczać jena siatce.\nAplikacja bierze poprawkę dla drukarki Epson serii L,\nz ramką wokół wydruku.\n") + label2 = Gtk.Label(label="Pojedyńcza etykieta powinna mieć wymiary: 1134x496 px.\nKomptabilny papier pochodzi z zasobów \'Galerii Papieru\'\n\nNa siatce etykiete dodajemy \'lpm\', a usuwamy \'ppm\'.\n\nAplikacja na ekranach HD Ready będzie zachowywać się\nniestabilnie! Zalecany ekran to Full HD.") + box = self.get_content_area() + box.add(label1) + box.add(label2) + self.show_all() + +class DialogAbout(Gtk.Dialog): + def __init__(self, parent): + Gtk.Dialog.__init__(self, title="O Programie", transient_for=parent, flags=0) + self.props.border_width = 20 + self.add_buttons( + Gtk.STOCK_OK, Gtk.ResponseType.OK + ) + + self.set_default_size(150, 100) + + label = Gtk.Label(label="\tAplikacja napisana na podstawie:\n\nhttps://python-gtk-3-tutorial.readthedocs.io/\n\n\t\tWersja: 0.220120-2\n\n\t\tPrzemysław R. Pietraszczyk\n\n\t\t\tWrzesień 2021\n\t\t\tLicencja: GPL\n\n") + + box = self.get_content_area() + box.add(label) + + button = Gtk.LinkButton("http://www.prp.xlx.pl", label="Strona Domowa") + box.add(button) + + self.show_all() + + + + +class DialogMessage(Gtk.Dialog): + def __init__(self, parent): + super().__init__(title="Błąd zaznaczenia", transient_for=parent, flags=0) + self.add_buttons( + Gtk.STOCK_OK, Gtk.ResponseType.OK + + ) + + self.set_default_size(150, 100) + + label = Gtk.Label(label="Powinieneś najperw zaznaczyć etykiete,\nz listy dostępnych etykiet.") + + box = self.get_content_area() + box.add(label) + self.show_all() + + + + +class FileChooserIMG(Gtk.Window): + def __init__(self): + Gtk.Window.__init__(self, title="Wybór plików graficznych") + global file_img_selected + + dialog = Gtk.FileChooserDialog(title="Please choose a file", parent=self, action=Gtk.FileChooserAction.OPEN) + dialog.add_buttons( + Gtk.STOCK_CANCEL, + Gtk.ResponseType.CANCEL, + Gtk.STOCK_OPEN, + Gtk.ResponseType.OK, + ) + + self.add_filters(dialog) + + response = dialog.run() + if response == Gtk.ResponseType.OK: + print("Open clicked") + print("File selected: " + dialog.get_filename()) + file_img_selected=dialog.get_filename() + list_labels.append(file_img_selected) + elif response == Gtk.ResponseType.CANCEL: + print("Cancel clicked") + + dialog.destroy() + + def add_filters(self, dialog): + filter_png = Gtk.FileFilter() + filter_png.set_name("Pliki PNG") + filter_png.add_mime_type("image/png") + dialog.add_filter(filter_png) + + filter_jpeg = Gtk.FileFilter() + filter_jpeg.set_name("Pliki JPEG") + filter_jpeg.add_mime_type("image/jpeg") + dialog.add_filter(filter_jpeg) + + + + +class FileChooserLabel(Gtk.Window): + def __init__(self, this): + global glob_liststore + Gtk.Window.__init__(self, title="Zapis etykiety") + global file_label_save + + dialog = Gtk.FileChooserDialog(title="Please choose a file", parent=self, action=Gtk.FileChooserAction.SAVE) + dialog.add_buttons( + Gtk.STOCK_CANCEL, + Gtk.ResponseType.CANCEL, + Gtk.STOCK_SAVE, + Gtk.ResponseType.OK, + ) + + self.add_filters(dialog) + + response = dialog.run() + if response == Gtk.ResponseType.OK: + print("Open clicked") + print("File selected: " + dialog.get_filename()) + file_label_save=dialog.get_filename() + pixbuf2 = new_pixbuf.scale_simple(1134, 496, GdkPixbuf.InterpType.BILINEAR) + pixbuf2.savev(file_label_save,"png", ["quality"], ["100"]) + this.available_labels(file_label_save) + + + elif response == Gtk.ResponseType.CANCEL: + print("Cancel clicked") + + dialog.destroy() + + def add_filters(self, dialog): + filter_png = Gtk.FileFilter() + filter_png.set_name("Pliki PNG") + filter_png.add_mime_type("image/png") + dialog.add_filter(filter_png) + """ + filter_jpeg = Gtk.FileFilter() + filter_jpeg.set_name("Pliki JPEG") + filter_jpeg.add_mime_type("image/jpeg") + dialog.add_filter(filter_jpeg) + """ + + + + + + + +class MyWindow(Gtk.Window): + + def __init__(self): + super().__init__() + + self.init_ui() + + + def refresh_label_view(self): + + if self.image2 != None: + grid.remove(self.image2) + self.image2=None + else: + grid.remove(self.image_new) + + + pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_scale( + filename=self.label_selected, + width=500, + height=250, + preserve_aspect_ratio=True) + + self.image_new = Gtk.Image.new_from_pixbuf(pixbuf) + grid.attach(self.image_new,0,1,1,1) + + self.show_all() + + def on_menu_file_new_template(self, widget): + + n = 0 + file_img_selected=get_resource_path("/usr/share/postagelabels/blank_small.png") + pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_scale( + filename=file_img_selected, + width=250, + height=117, #125, + preserve_aspect_ratio=True) + + + for l in label_limits: + + print ("IMAGE2: "+str(pixbuf)) + if pixbuf is not None: + self.image_template[n].set_from_pixbuf(pixbuf) + print_limits[n][2] = None + + + + n += 1 + self.show_all() # najprawdopodobnie wymagane po pakietowaniu + + def on_menu_file_load_img_generic(self, widget): + global grid + filename=FileChooserIMG() + + if len(file_img_selected) != 0: + + if self.image2 != None: + grid.remove(self.image2) + self.image2=None + else: + grid.remove(self.image_new) + + + pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_scale( + filename=file_img_selected, + width=500, + height=250, + preserve_aspect_ratio=True) + + self.image_new = Gtk.Image.new_from_pixbuf(pixbuf) + + grid.attach(self.image_new,0,1,1,1) + + + self.scrolled_window.remove(self.treeview) + grid.remove(self.scrolled_window) + self.liststore = Gtk.ListStore(str, str) + + self.treeview.remove_column(self.column_text) + + for o in list_labels: + self.liststore.append([o,""]) + + self.scrolled_window = Gtk.ScrolledWindow () + self.scrolled_window.set_policy (Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) + + self.treeview = Gtk.TreeView(model=self.liststore) + + self.renderer_text = Gtk.CellRendererText() + self.column_text = Gtk.TreeViewColumn("Dostępne etykiety", self.renderer_text, text=0) + self.treeview.append_column(self.column_text) + + self.treeview.connect("button_release_event", self.mouse_selected) + + self.scrolled_window.add (self.treeview) + grid.attach(self.scrolled_window,0,2,1,6) + + self.show_all() + + def on_menu_composite_generic(self, widget): + dialog = DialogCompositor(self) + response = dialog.run() + + if response == Gtk.ResponseType.OK: + print("Save clicked") + dialog_file_label=FileChooserLabel(self) + elif response == Gtk.ResponseType.CANCEL: + print("Cancel clicked") + + dialog.destroy() + + def on_menu_file_quit(self, widget): + Gtk.main_quit() + + def on_menu_help(self, widget): + dialog = DialogHelp(self) + response = dialog.run() + + dialog.destroy() + + def on_menu_about(self, widget): + dialog = DialogAbout(self) + response = dialog.run() + + dialog.destroy() + + + def add_info_menu_actions(self, action_group): + action_info_menu = Gtk.Action(name="InfoMenu", label="Info") + action_group.add_action(action_info_menu) + + action_new = Gtk.Action( + name="Help", + label="Pomoc", + tooltip="Create a new file", + ) + action_new.connect("activate", self.on_menu_help) + action_group.add_action_with_accel(action_new, None) + + action_new = Gtk.Action( + name="About", + label="O Programie", + tooltip="Create a new file", + ) + action_new.connect("activate", self.on_menu_about) + action_group.add_action_with_accel(action_new, None) + + def add_file_menu_actions(self, action_group): + action_filemenu = Gtk.Action(name="FileMenu", label="Plik") + action_group.add_action(action_filemenu) + + action_fileloadmenu = Gtk.Action(name="FileLoad", stock_id=Gtk.STOCK_NEW) + action_group.add_action(action_fileloadmenu) + + action_new = Gtk.Action( + name="LoadImg", + label="Załaduj etykiete", + tooltip="Wczytuje etykiete", + ) + action_new.connect("activate", self.on_menu_file_load_img_generic) + action_group.add_action_with_accel(action_new, None) + + + action_new = Gtk.Action( + name="NewTemplate", + label="Nowy szablon", + tooltip="Tworzy szablon na nowo", + ) + action_new.connect("activate", self.on_menu_file_new_template) + action_group.add_action_with_accel(action_new, None) + + + action_new = Gtk.Action( + name="Composite", + label="Kompozytor", + tooltip="Tworzy nową etykiete", + ) + action_new.connect("activate", self.on_menu_composite_generic) + action_group.add_action_with_accel(action_new, None) + + + action_print = Gtk.Action(name="FilePrint", stock_id=Gtk.STOCK_PRINT) + action_print.connect("activate", self.print_image) + action_group.add_action(action_print) + + + action_filequit = Gtk.Action(name="FileQuit", stock_id=Gtk.STOCK_QUIT) + action_filequit.connect("activate", self.on_menu_file_quit) + action_group.add_action(action_filequit) + + + + # tworzy menu bar + def create_ui_manager(self): + uimanager = Gtk.UIManager() + + # Throws exception if something went wrong + uimanager.add_ui_from_string(UI_INFO) + + # Add the accelerator group to the toplevel window + accelgroup = uimanager.get_accel_group() + self.add_accel_group(accelgroup) + return uimanager + + + + def mouse_selected(self, tv, event): + + if event.button == 1: + + # Begin added code + pthinfo = self.treeview.get_path_at_pos(event.x, event.y) + if pthinfo != None: + path,col,cellx,celly = pthinfo + self.treeview.grab_focus() + self.treeview.set_cursor(path,col,0) + # End added code + + selection = self.treeview.get_selection() + (model, iter) = selection.get_selected() + print(model[iter][0]) + self.label_selected = model[iter][0] + + self.refresh_label_view() + + + def onclick_in_pixbuf (self, box, event): + if event.button == 1: + try: + print ("\nKliknieto na pozycji") + print (event.x, event.y) + print ("\n") + e = [int(event.x), int(event.y)] + n = 0 + + pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_scale( + filename=self.label_selected, + width=250, + height=117, #125, + preserve_aspect_ratio=True) + + + for l in label_limits: + + x, y = l[:] + e_x, e_y = e[:] + + if e_x >= x and e_y >= y and e_x <= x+250 and e_y <= y+117: + if pixbuf is not None: + self.image_template[n].set_from_pixbuf(pixbuf) + print_limits[n][2] = self.label_selected + + break + n += 1 + except AttributeError: + + dialog = DialogMessage(self) + response = dialog.run() + + + dialog.destroy() + if event.button == 3: + + + e = [int(event.x), int(event.y)] + n = 0 + + file_img_selected=get_resource_path("/usr/share/postagelabels/blank_small.png") + pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_scale( + filename=file_img_selected, + width=250, + height=117, #125, + preserve_aspect_ratio=True) + + + for l in label_limits: + + x, y = l[:] + e_x, e_y = e[:] + + if e_x >= x and e_y >= y and e_x <= x+250 and e_y <= y+117: + print ("IMAGE2: "+str(pixbuf)) + if pixbuf is not None: + self.image_template[n].set_from_pixbuf(pixbuf) + print_limits[n][2] = None + + + break + n += 1 + self.show_all() # najprawdopodobnie wymagane po pakietowaniu + + def on_mouse_move_in_pixbuf (self, box, event): + e = [int(event.x), int(event.y)] + n = 0 + for l in label_limits: + + x, y = l[:] + e_x, e_y = e[:] + + if e_x >= x and e_y >= y and e_x <= x+200 and e_y <= y+92: + pass + + # dnae dla wydruku + def set_print_limits(self): + start_x = 0 + start_y = 0 + end_x = BLANK_W * 2 #1234*2 + end_y = BLANK_H * 6 #3508 + cols = 2 + rows = 6 + width = BLANK_W #1234 + height = BLANK_H #585 + + for j in range (start_y, end_y, height): + for i in range (start_x, end_x, width): + print_limits.append([i, j, None]) + + print ("PRINT LIMIST") + print (print_limits) + + + # dane dla siatki + def set_label_limits(self): + start_x = 0 + start_y = 0 + end_x = 500 + end_y = 104 * 6 #117 * 6 #700 + cols = 2 + rows = 6 + width = 250 + height = 104 #117 + + for j in range (start_y, end_y, height): + for i in range (start_x, end_x, width): + label_limits.append([i, j]) + + + def print_page(self, operation=None, context=None, page_nr=None): + + ctx = context.get_cairo_context() + + # make cairo ImageSurface from the png file + surface = cairo.ImageSurface.create_from_png('/tmp/postagelabels.png') + + #ctx.set_operator(cairo.OPERATOR_SOURCE) + ctx.set_source_surface(surface) + ctx.paint () + #ctx.set_operator(cairo.OPERATOR_OVER) + os.remove("/tmp/postagelabels.png"); + + + + #page = self.doc.get_page(page_nr) + #page.render(ctx) + + + + + + def print_image(self, widget): + print ("PRINT LIMITS") + print (print_limits) + + page_width = 210 + page_height = 297 + #page_margin_top = 20 + dpi = 600 + #_mm_dpi = 72 / 25.4 + + + + + pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_size('/usr/share/postagelabels/szablon.png', 2480, 3508) + + for i in range (12): + if print_limits[i][2] != None: + + if i%2 == 1: + center_beam = 24 + else: + center_beam = 0 + + label = GdkPixbuf.Pixbuf.new_from_file_at_size(print_limits[i][2], BLANK_W, BLANK_H) + #self.freeze_child_notify() + label.composite(pixbuf, print_limits[i][0]+89+center_beam, print_limits[i][1]+237, label.get_width(), label.get_height(), print_limits[i][0]+89+center_beam, print_limits[i][1]+237, 1, 1, GdkPixbuf.InterpType.NEAREST, 255) + #self.thaw_child_notify() + + # z orginalnymi wielkościami nie chce drukowac + pixbuf2 = pixbuf.scale_simple(600, 855, GdkPixbuf.InterpType.BILINEAR) + + pixbuf2.savev("/tmp/postagelabels.png","png", ["quality"], ["100"]) + """ + paper_size = Gtk.PaperSize.new_custom("1.0x", "2480 x 3508", 2480, 3508, Gtk.Unit.POINTS) + + page_setup = Gtk.PageSetup() + page_setup.set_paper_size(paper_size) + pd = Gtk.PrintOperation() + #pd.set_embed_page_setup(True) + pd.set_default_page_setup(page_setup) + #pd.set_unit(Gtk.Unit.POINTS) + pd.set_n_pages(1) + pd.connect("draw_page", self.print_page) + result = pd.run(Gtk.PrintOperationAction.PRINT_DIALOG, None) # window zamisat None + print(result) # handle errors etc. + """ + + + #ps= Gtk.PaperSize.new_custom("1.0x", "2480 x 3508", 2480, 3508, Gtk.Unit.POINTS) + + ps = Gtk.PaperSize.new_custom("1.0x", "cc", page_width, page_height, Gtk.Unit.MM) + print_settings = Gtk.PrintSettings() + print_settings.set_resolution(dpi) + + page_setup = Gtk.PageSetup() + page_setup.set_paper_size(ps) + page_setup.set_bottom_margin(0.0, Gtk.Unit.MM) + page_setup.set_left_margin(0.0, Gtk.Unit.MM) + page_setup.set_right_margin(0.0, Gtk.Unit.MM) + page_setup.set_top_margin(0.0, Gtk.Unit.MM) + page_setup.set_orientation(Gtk.PageOrientation.PORTRAIT) + + + print_operation = Gtk.PrintOperation() + print_operation.set_n_pages(1) + print_operation.set_default_page_setup(page_setup) + print_operation.set_print_settings(print_settings) + print_operation.connect("draw_page", self.print_page) + #print_operation.set_export_filename("example.pdf") + + result = print_operation.run(Gtk.PrintOperationAction.PRINT_DIALOG, None) # window zamisat None + + #result = print_operation.run(Gtk.PrintOperationAction.PREVIEW, None) + print(result) + + def available_labels(self, name): + + self.scrolled_window.remove(self.treeview) + grid.remove(self.scrolled_window) + self.liststore = Gtk.ListStore(str, str) + + self.treeview.remove_column(self.column_text) + + list_labels.append(name) + for o in list_labels: + self.liststore.append([o,""]) + + self.scrolled_window = Gtk.ScrolledWindow () + self.scrolled_window.set_policy (Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) + + self.treeview = Gtk.TreeView(model=self.liststore) + + self.renderer_text = Gtk.CellRendererText() + self.column_text = Gtk.TreeViewColumn("Dostępne etykiety", self.renderer_text, text=0) + self.treeview.append_column(self.column_text) + + self.treeview.connect("button_release_event", self.mouse_selected) + + self.scrolled_window.add (self.treeview) + grid.attach(self.scrolled_window,0,2,1,6) + + self.show_all() + + + def init_ui(self): + global grid + + + + self.image_new=None + self.props.border_width = 20 + + self.add(grid) + + grid.set_row_spacing(10) + grid.set_column_spacing(10) + grid.set_column_homogeneous(True) # rozszerza kontrolke z utworami na resztę okna + + action_group = Gtk.ActionGroup(name="my_actions") + + self.add_file_menu_actions(action_group) + self.add_info_menu_actions(action_group) + + uimanager = self.create_ui_manager() + uimanager.insert_action_group(action_group) + + menubar = uimanager.get_widget("/MenuBar") + box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL) + box.pack_start(menubar, False, False, 0) + + + grid.attach(box, 0, 0, 2, 1) + + + + event_box = Gtk.EventBox () + event_box.connect ('button-press-event', self.onclick_in_pixbuf) + event_box.connect("motion-notify-event", self.on_mouse_move_in_pixbuf) + event_box.add_events(Gdk.EventMask.POINTER_MOTION_MASK) + + self.set_label_limits() + self.set_print_limits() + frame = Gtk.Frame() + + + file_img_selected=get_resource_path("/usr/share/postagelabels/blank_small.png") + pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_scale( + filename=file_img_selected, + width=250, + height=117, #125 + preserve_aspect_ratio=True) + + + self.all_img_template = Gtk.Grid() + + self.image_template = [] + self.image_template= [0 for i in range(12)] + + + left = 0 + top = 1 + top_next=False + multiplier = 0 + n_multi = 1; + first = False + n = 2 + for i in range(12): + print ("left: "+str(left)+" top: "+str(top)) + + if left == 2: + left = 0; + n_multi += 1 + print ("multi: " +str(n_multi)+" %"+ str(n_multi%4)) + if n_multi%2== 0: + if first == False: + multiplier = 1 + first = True + multiplier += n + n *= 2 + self.image_template[i] = Gtk.Image.new_from_pixbuf(pixbuf) + self.all_img_template.attach(self.image_template[i], left, top+multiplier, 1 , top+multiplier) + left += 1 + if top_next == False: + top_next = True + pass + else: + top_next = False + top +=1 + + event_box.add(self.all_img_template) + + + frame.add(event_box) + grid.attach(frame,1,1,1,6) + + + + # powiększenie etykiety po lewej stronie + file_img_selected=get_resource_path("/usr/share/postagelabels/blank_small.png") + pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_scale( + filename=file_img_selected, + width=500, + height=250, + preserve_aspect_ratio=True) + + self.image2 = Gtk.Image.new_from_pixbuf(pixbuf) + + grid.attach(self.image2,0,1,1,1) + + + + self.liststore = Gtk.ListStore(str, str) + self.treeview = Gtk.TreeView(model=self.liststore) + self.treeview.connect("button_release_event", self.mouse_selected) + + + + self.renderer_text = Gtk.CellRendererText() + self.column_text = Gtk.TreeViewColumn("Dostępne etykiety", self.renderer_text, text=0) + self.treeview.append_column(self.column_text) + + self.scrolled_window = Gtk.ScrolledWindow () + self.scrolled_window.set_policy (Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) + + self.scrolled_window.add (self.treeview) + grid.attach(self.scrolled_window,0,2,1,6) + + + + + self.set_border_width(10) + self.set_title("Naklejki Pocztowe") + self.set_default_size(1000, 655) + self.connect("destroy", Gtk.main_quit) + + + +win = MyWindow() +win.show_all() +Gtk.main() + + + + + + + +