comparison postagelabels/postagelabels.py @ 0:dcd610585610

INIT
author prymula <prymula76@outlook.com>
date Thu, 21 Sep 2023 22:32:14 +0200
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:dcd610585610
1 #!/usr/bin/env python3
2 # Postage Labels - aplikacja do aranżacji wydruków etykiet pocztowych
3 # autor: Przemysław R. Pietraszczyk
4 # licencja: GPL
5 # data 20-IX-2021
6 # edytor: Geany
7
8 import sys
9 import cairo
10 import gi, os
11 gi.require_version("Gtk", "3.0")
12 from gi.repository import Gtk, GdkPixbuf, Gdk
13 from gi.repository.GdkPixbuf import Pixbuf
14
15
16 UI_INFO = """
17 <ui>
18 <menubar name='MenuBar'>
19 <menu action='FileMenu'>
20 <menu action='FileLoad'>
21 <menuitem action='NewTemplate' />
22 <menuitem action='LoadImg' />
23 <menuitem action='Composite' />
24 </menu>
25 <menuitem action='FilePrint' />
26 <separator />
27 <menuitem action='FileQuit' />
28 </menu>
29 <menu action='InfoMenu'>
30 <menuitem action='Help'/>
31 <menuitem action='About'/>
32 </menu>
33 </menubar>
34
35 </ui>
36 """
37
38 grid = Gtk.Grid()
39 file_img_selected=""
40 file_label_save=""
41 new_pixbuf=""
42 list_labels = []
43 label_limits = []
44 print_limits = []
45 #label_selected = ""
46 BLANK_W = 1134
47 BLANK_H = 496
48
49
50 def get_resource_path(rel_path):
51 dir_of_py_file = os.path.dirname(__file__)
52 rel_path_to_resource = os.path.join(dir_of_py_file, rel_path)
53 abs_path_to_resource = os.path.abspath(rel_path_to_resource)
54 return abs_path_to_resource
55
56 class DialogCompositor(Gtk.Dialog):
57 def __init__(self, parent):
58 global new_pixbuf
59 Gtk.Dialog.__init__(self, title="Kompozytor", transient_for=parent, flags=0)
60 self.props.border_width = 20
61 self.add_buttons(
62 Gtk.STOCK_CANCEL,
63 Gtk.ResponseType.CANCEL,
64 Gtk.STOCK_SAVE,
65 Gtk.ResponseType.OK,
66 )
67 self.compos = Gtk.Grid()
68 file_img_composite=get_resource_path("/usr/share/postagelabels/blank_small.png")
69 new_pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_scale(
70 filename=file_img_composite,
71 width=500,
72 height=250,
73 preserve_aspect_ratio=True)
74
75 self.add(self.compos)
76
77 self.compos.set_row_spacing(10)
78 self.compos.set_column_spacing(10)
79 #self.compos.set_column_homogeneous(True) # rozszerza kontrolke na resztę okna
80
81 # potrzebne do wyśwetlenia tekstu
82 self.surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, new_pixbuf.get_width(), new_pixbuf.get_height())
83 self.context = cairo.Context(self.surface)
84
85 Gdk.cairo_set_source_pixbuf(self.context, new_pixbuf, 0, 0)
86 self.context.paint() #paint the pixbuf
87
88 self.fontsize= 25
89
90 box = self.get_content_area()
91
92 self.com_first = Gtk.Image.new_from_pixbuf(new_pixbuf)
93 self.compos.attach(self.com_first,0,0,1,3)
94
95
96 self.entry1 = Gtk.Entry()
97 self.entry1.set_text("Hello World")
98 self.compos.attach(self.entry1,1,0,1,1)
99
100
101 self.entry2 = Gtk.Entry()
102 self.entry2.set_text("Hello World")
103 self.compos.attach(self.entry2,1,1,1,1)
104
105 self.entry3 = Gtk.Entry()
106 self.entry3.set_text("Hello World")
107 self.compos.attach(self.entry3,1,2,1,1)
108
109 self.entry4 = Gtk.Entry()
110 self.entry4.set_text("Hello World")
111 self.compos.attach(self.entry4,1,3,1,1)
112
113 button1 = Gtk.Button.new_with_label("Aktualizuj")
114 button1.connect("clicked", self.actualization1)
115 self.compos.attach(button1,2,0,1,1)
116
117 button2 = Gtk.Button.new_with_label("Aktualizuj")
118 button2.connect("clicked", self.actualization2)
119 self.compos.attach(button2,2,1,1,1)
120
121 button3 = Gtk.Button.new_with_label("Aktualizuj")
122 button3.connect("clicked", self.actualization3)
123 self.compos.attach(button3,2,2,1,1)
124
125 button4 = Gtk.Button.new_with_label("Aktualizuj")
126 button4.connect("clicked", self.actualization4)
127 self.compos.attach(button4,2,3,1,1)
128
129
130 button_clear = Gtk.Button.new_with_label("Wyczyść")
131 button_clear.connect("clicked", self.entry_clear)
132 self.compos.attach(button_clear,3,0,1,4)
133 box.add(self.compos)
134
135 self.show_all()
136
137 def entry_clear(self, button):
138 global new_pixbuf
139 file_img_selected=get_resource_path("/usr/share/postagelabels/blank_small.png")
140 new_pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_scale(
141 filename=file_img_selected,
142 width=500,
143 height=250,
144 preserve_aspect_ratio=True)
145
146
147 if self.com_first != None:
148 self.compos.remove(self.com_first)
149 self.com_first=None
150 else:
151 self.compos.remove(self.com_new)
152
153 # czyści etykiete
154 self.surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, new_pixbuf.get_width(), new_pixbuf.get_height())
155 self.context = cairo.Context(self.surface)
156 Gdk.cairo_set_source_pixbuf(self.context, new_pixbuf, 0, 0)
157 self.context.paint() #paint the pixbuf
158
159
160 self.com_new = Gtk.Image.new_from_pixbuf(new_pixbuf)
161 self.compos.attach(self.com_new,0,0,1,3)
162
163 self.show_all()
164
165
166 def actualization1(self, button):
167 global new_pixbuf
168 self.context.move_to(15, 20+self.fontsize)
169 self.context.set_font_size(self.fontsize)
170 self.context.set_source_rgba(0,0,0,1)
171 self.context.show_text(self.entry1.get_text())
172
173 #get the resulting pixbuf
174 self.surface= self.context.get_target()
175 new_pixbuf= Gdk.pixbuf_get_from_surface(self.surface, 0, 0, self.surface.get_width(), self.surface.get_height())
176
177 if self.com_first != None:
178 self.compos.remove(self.com_first)
179 self.com_first=None
180 else:
181 self.compos.remove(self.com_new)
182
183
184 self.com_new = Gtk.Image.new_from_pixbuf(new_pixbuf)
185 self.compos.attach(self.com_new,0,0,1,3)
186
187 self.show_all()
188
189 def actualization2(self, button):
190 global new_pixbuf
191 self.context.move_to(15, 20+self.fontsize+self.fontsize+15)
192 self.context.set_font_size(self.fontsize)
193 self.context.set_source_rgba(0,0,0,1)
194 self.context.show_text(self.entry2.get_text())
195
196 #get the resulting pixbuf
197 self.surface= self.context.get_target()
198 new_pixbuf= Gdk.pixbuf_get_from_surface(self.surface, 0, 0, self.surface.get_width(), self.surface.get_height())
199
200 if self.com_first != None:
201 self.compos.remove(self.com_first)
202 self.com_first=None
203 else:
204 self.compos.remove(self.com_new)
205
206
207 self.com_new = Gtk.Image.new_from_pixbuf(new_pixbuf)
208 self.compos.attach(self.com_new,0,0,1,3)
209
210 self.show_all()
211 def actualization3(self, button):
212 global new_pixbuf
213 self.context.move_to(15, 20+self.fontsize+self.fontsize+self.fontsize+30)
214 self.context.set_font_size(self.fontsize)
215 self.context.set_source_rgba(0,0,0,1)
216 self.context.show_text(self.entry3.get_text())
217
218 #get the resulting pixbuf
219 self.surface= self.context.get_target()
220 new_pixbuf= Gdk.pixbuf_get_from_surface(self.surface, 0, 0, self.surface.get_width(), self.surface.get_height())
221
222 if self.com_first != None:
223 self.compos.remove(self.com_first)
224 self.com_first=None
225 else:
226 self.compos.remove(self.com_new)
227
228
229 self.com_new = Gtk.Image.new_from_pixbuf(new_pixbuf)
230 self.compos.attach(self.com_new,0,0,1,3)
231
232 self.show_all()
233
234 def actualization4(self, button):
235 global new_pixbuf
236 self.context.move_to(15, 20+self.fontsize+self.fontsize+self.fontsize+self.fontsize+50)
237 self.context.set_font_size(self.fontsize)
238 self.context.set_source_rgba(0,0,0,1)
239 self.context.show_text(self.entry4.get_text())
240
241 #get the resulting pixbuf
242 self.surface= self.context.get_target()
243 new_pixbuf= Gdk.pixbuf_get_from_surface(self.surface, 0, 0, self.surface.get_width(), self.surface.get_height())
244
245 if self.com_first != None:
246 self.compos.remove(self.com_first)
247 self.com_first=None
248 else:
249 self.compos.remove(self.com_new)
250
251
252 self.com_new = Gtk.Image.new_from_pixbuf(new_pixbuf)
253 self.compos.attach(self.com_new,0,0,1,3)
254
255 self.show_all()
256
257
258 class DialogHelp(Gtk.Dialog):
259 def __init__(self, parent):
260 Gtk.Dialog.__init__(self, title="Pomoc", transient_for=parent, flags=0)
261 self.props.border_width = 20
262 self.add_buttons(
263 Gtk.STOCK_OK, Gtk.ResponseType.OK
264 )
265
266 self.set_default_size(150, 100)
267 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")
268 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.")
269 box = self.get_content_area()
270 box.add(label1)
271 box.add(label2)
272 self.show_all()
273
274 class DialogAbout(Gtk.Dialog):
275 def __init__(self, parent):
276 Gtk.Dialog.__init__(self, title="O Programie", transient_for=parent, flags=0)
277 self.props.border_width = 20
278 self.add_buttons(
279 Gtk.STOCK_OK, Gtk.ResponseType.OK
280 )
281
282 self.set_default_size(150, 100)
283
284 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")
285
286 box = self.get_content_area()
287 box.add(label)
288
289 button = Gtk.LinkButton("http://www.prp.xlx.pl", label="Strona Domowa")
290 box.add(button)
291
292 self.show_all()
293
294
295
296
297 class DialogMessage(Gtk.Dialog):
298 def __init__(self, parent):
299 super().__init__(title="Błąd zaznaczenia", transient_for=parent, flags=0)
300 self.add_buttons(
301 Gtk.STOCK_OK, Gtk.ResponseType.OK
302
303 )
304
305 self.set_default_size(150, 100)
306
307 label = Gtk.Label(label="Powinieneś najperw zaznaczyć etykiete,\nz listy dostępnych etykiet.")
308
309 box = self.get_content_area()
310 box.add(label)
311 self.show_all()
312
313
314
315
316 class FileChooserIMG(Gtk.Window):
317 def __init__(self):
318 Gtk.Window.__init__(self, title="Wybór plików graficznych")
319 global file_img_selected
320
321 dialog = Gtk.FileChooserDialog(title="Please choose a file", parent=self, action=Gtk.FileChooserAction.OPEN)
322 dialog.add_buttons(
323 Gtk.STOCK_CANCEL,
324 Gtk.ResponseType.CANCEL,
325 Gtk.STOCK_OPEN,
326 Gtk.ResponseType.OK,
327 )
328
329 self.add_filters(dialog)
330
331 response = dialog.run()
332 if response == Gtk.ResponseType.OK:
333 print("Open clicked")
334 print("File selected: " + dialog.get_filename())
335 file_img_selected=dialog.get_filename()
336 list_labels.append(file_img_selected)
337 elif response == Gtk.ResponseType.CANCEL:
338 print("Cancel clicked")
339
340 dialog.destroy()
341
342 def add_filters(self, dialog):
343 filter_png = Gtk.FileFilter()
344 filter_png.set_name("Pliki PNG")
345 filter_png.add_mime_type("image/png")
346 dialog.add_filter(filter_png)
347
348 filter_jpeg = Gtk.FileFilter()
349 filter_jpeg.set_name("Pliki JPEG")
350 filter_jpeg.add_mime_type("image/jpeg")
351 dialog.add_filter(filter_jpeg)
352
353
354
355
356 class FileChooserLabel(Gtk.Window):
357 def __init__(self, this):
358 global glob_liststore
359 Gtk.Window.__init__(self, title="Zapis etykiety")
360 global file_label_save
361
362 dialog = Gtk.FileChooserDialog(title="Please choose a file", parent=self, action=Gtk.FileChooserAction.SAVE)
363 dialog.add_buttons(
364 Gtk.STOCK_CANCEL,
365 Gtk.ResponseType.CANCEL,
366 Gtk.STOCK_SAVE,
367 Gtk.ResponseType.OK,
368 )
369
370 self.add_filters(dialog)
371
372 response = dialog.run()
373 if response == Gtk.ResponseType.OK:
374 print("Open clicked")
375 print("File selected: " + dialog.get_filename())
376 file_label_save=dialog.get_filename()
377 pixbuf2 = new_pixbuf.scale_simple(1134, 496, GdkPixbuf.InterpType.BILINEAR)
378 pixbuf2.savev(file_label_save,"png", ["quality"], ["100"])
379 this.available_labels(file_label_save)
380
381
382 elif response == Gtk.ResponseType.CANCEL:
383 print("Cancel clicked")
384
385 dialog.destroy()
386
387 def add_filters(self, dialog):
388 filter_png = Gtk.FileFilter()
389 filter_png.set_name("Pliki PNG")
390 filter_png.add_mime_type("image/png")
391 dialog.add_filter(filter_png)
392 """
393 filter_jpeg = Gtk.FileFilter()
394 filter_jpeg.set_name("Pliki JPEG")
395 filter_jpeg.add_mime_type("image/jpeg")
396 dialog.add_filter(filter_jpeg)
397 """
398
399
400
401
402
403
404
405 class MyWindow(Gtk.Window):
406
407 def __init__(self):
408 super().__init__()
409
410 self.init_ui()
411
412
413 def refresh_label_view(self):
414
415 if self.image2 != None:
416 grid.remove(self.image2)
417 self.image2=None
418 else:
419 grid.remove(self.image_new)
420
421
422 pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_scale(
423 filename=self.label_selected,
424 width=500,
425 height=250,
426 preserve_aspect_ratio=True)
427
428 self.image_new = Gtk.Image.new_from_pixbuf(pixbuf)
429 grid.attach(self.image_new,0,1,1,1)
430
431 self.show_all()
432
433 def on_menu_file_new_template(self, widget):
434
435 n = 0
436 file_img_selected=get_resource_path("/usr/share/postagelabels/blank_small.png")
437 pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_scale(
438 filename=file_img_selected,
439 width=250,
440 height=117, #125,
441 preserve_aspect_ratio=True)
442
443
444 for l in label_limits:
445
446 print ("IMAGE2: "+str(pixbuf))
447 if pixbuf is not None:
448 self.image_template[n].set_from_pixbuf(pixbuf)
449 print_limits[n][2] = None
450
451
452
453 n += 1
454 self.show_all() # najprawdopodobnie wymagane po pakietowaniu
455
456 def on_menu_file_load_img_generic(self, widget):
457 global grid
458 filename=FileChooserIMG()
459
460 if len(file_img_selected) != 0:
461
462 if self.image2 != None:
463 grid.remove(self.image2)
464 self.image2=None
465 else:
466 grid.remove(self.image_new)
467
468
469 pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_scale(
470 filename=file_img_selected,
471 width=500,
472 height=250,
473 preserve_aspect_ratio=True)
474
475 self.image_new = Gtk.Image.new_from_pixbuf(pixbuf)
476
477 grid.attach(self.image_new,0,1,1,1)
478
479
480 self.scrolled_window.remove(self.treeview)
481 grid.remove(self.scrolled_window)
482 self.liststore = Gtk.ListStore(str, str)
483
484 self.treeview.remove_column(self.column_text)
485
486 for o in list_labels:
487 self.liststore.append([o,""])
488
489 self.scrolled_window = Gtk.ScrolledWindow ()
490 self.scrolled_window.set_policy (Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
491
492 self.treeview = Gtk.TreeView(model=self.liststore)
493
494 self.renderer_text = Gtk.CellRendererText()
495 self.column_text = Gtk.TreeViewColumn("Dostępne etykiety", self.renderer_text, text=0)
496 self.treeview.append_column(self.column_text)
497
498 self.treeview.connect("button_release_event", self.mouse_selected)
499
500 self.scrolled_window.add (self.treeview)
501 grid.attach(self.scrolled_window,0,2,1,6)
502
503 self.show_all()
504
505 def on_menu_composite_generic(self, widget):
506 dialog = DialogCompositor(self)
507 response = dialog.run()
508
509 if response == Gtk.ResponseType.OK:
510 print("Save clicked")
511 dialog_file_label=FileChooserLabel(self)
512 elif response == Gtk.ResponseType.CANCEL:
513 print("Cancel clicked")
514
515 dialog.destroy()
516
517 def on_menu_file_quit(self, widget):
518 Gtk.main_quit()
519
520 def on_menu_help(self, widget):
521 dialog = DialogHelp(self)
522 response = dialog.run()
523
524 dialog.destroy()
525
526 def on_menu_about(self, widget):
527 dialog = DialogAbout(self)
528 response = dialog.run()
529
530 dialog.destroy()
531
532
533 def add_info_menu_actions(self, action_group):
534 action_info_menu = Gtk.Action(name="InfoMenu", label="Info")
535 action_group.add_action(action_info_menu)
536
537 action_new = Gtk.Action(
538 name="Help",
539 label="Pomoc",
540 tooltip="Create a new file",
541 )
542 action_new.connect("activate", self.on_menu_help)
543 action_group.add_action_with_accel(action_new, None)
544
545 action_new = Gtk.Action(
546 name="About",
547 label="O Programie",
548 tooltip="Create a new file",
549 )
550 action_new.connect("activate", self.on_menu_about)
551 action_group.add_action_with_accel(action_new, None)
552
553 def add_file_menu_actions(self, action_group):
554 action_filemenu = Gtk.Action(name="FileMenu", label="Plik")
555 action_group.add_action(action_filemenu)
556
557 action_fileloadmenu = Gtk.Action(name="FileLoad", stock_id=Gtk.STOCK_NEW)
558 action_group.add_action(action_fileloadmenu)
559
560 action_new = Gtk.Action(
561 name="LoadImg",
562 label="Załaduj etykiete",
563 tooltip="Wczytuje etykiete",
564 )
565 action_new.connect("activate", self.on_menu_file_load_img_generic)
566 action_group.add_action_with_accel(action_new, None)
567
568
569 action_new = Gtk.Action(
570 name="NewTemplate",
571 label="Nowy szablon",
572 tooltip="Tworzy szablon na nowo",
573 )
574 action_new.connect("activate", self.on_menu_file_new_template)
575 action_group.add_action_with_accel(action_new, None)
576
577
578 action_new = Gtk.Action(
579 name="Composite",
580 label="Kompozytor",
581 tooltip="Tworzy nową etykiete",
582 )
583 action_new.connect("activate", self.on_menu_composite_generic)
584 action_group.add_action_with_accel(action_new, None)
585
586
587 action_print = Gtk.Action(name="FilePrint", stock_id=Gtk.STOCK_PRINT)
588 action_print.connect("activate", self.print_image)
589 action_group.add_action(action_print)
590
591
592 action_filequit = Gtk.Action(name="FileQuit", stock_id=Gtk.STOCK_QUIT)
593 action_filequit.connect("activate", self.on_menu_file_quit)
594 action_group.add_action(action_filequit)
595
596
597
598 # tworzy menu bar
599 def create_ui_manager(self):
600 uimanager = Gtk.UIManager()
601
602 # Throws exception if something went wrong
603 uimanager.add_ui_from_string(UI_INFO)
604
605 # Add the accelerator group to the toplevel window
606 accelgroup = uimanager.get_accel_group()
607 self.add_accel_group(accelgroup)
608 return uimanager
609
610
611
612 def mouse_selected(self, tv, event):
613
614 if event.button == 1:
615
616 # Begin added code
617 pthinfo = self.treeview.get_path_at_pos(event.x, event.y)
618 if pthinfo != None:
619 path,col,cellx,celly = pthinfo
620 self.treeview.grab_focus()
621 self.treeview.set_cursor(path,col,0)
622 # End added code
623
624 selection = self.treeview.get_selection()
625 (model, iter) = selection.get_selected()
626 print(model[iter][0])
627 self.label_selected = model[iter][0]
628
629 self.refresh_label_view()
630
631
632 def onclick_in_pixbuf (self, box, event):
633 if event.button == 1:
634 try:
635 print ("\nKliknieto na pozycji")
636 print (event.x, event.y)
637 print ("\n")
638 e = [int(event.x), int(event.y)]
639 n = 0
640
641 pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_scale(
642 filename=self.label_selected,
643 width=250,
644 height=117, #125,
645 preserve_aspect_ratio=True)
646
647
648 for l in label_limits:
649
650 x, y = l[:]
651 e_x, e_y = e[:]
652
653 if e_x >= x and e_y >= y and e_x <= x+250 and e_y <= y+117:
654 if pixbuf is not None:
655 self.image_template[n].set_from_pixbuf(pixbuf)
656 print_limits[n][2] = self.label_selected
657
658 break
659 n += 1
660 except AttributeError:
661
662 dialog = DialogMessage(self)
663 response = dialog.run()
664
665
666 dialog.destroy()
667 if event.button == 3:
668
669
670 e = [int(event.x), int(event.y)]
671 n = 0
672
673 file_img_selected=get_resource_path("/usr/share/postagelabels/blank_small.png")
674 pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_scale(
675 filename=file_img_selected,
676 width=250,
677 height=117, #125,
678 preserve_aspect_ratio=True)
679
680
681 for l in label_limits:
682
683 x, y = l[:]
684 e_x, e_y = e[:]
685
686 if e_x >= x and e_y >= y and e_x <= x+250 and e_y <= y+117:
687 print ("IMAGE2: "+str(pixbuf))
688 if pixbuf is not None:
689 self.image_template[n].set_from_pixbuf(pixbuf)
690 print_limits[n][2] = None
691
692
693 break
694 n += 1
695 self.show_all() # najprawdopodobnie wymagane po pakietowaniu
696
697 def on_mouse_move_in_pixbuf (self, box, event):
698 e = [int(event.x), int(event.y)]
699 n = 0
700 for l in label_limits:
701
702 x, y = l[:]
703 e_x, e_y = e[:]
704
705 if e_x >= x and e_y >= y and e_x <= x+200 and e_y <= y+92:
706 pass
707
708 # dnae dla wydruku
709 def set_print_limits(self):
710 start_x = 0
711 start_y = 0
712 end_x = BLANK_W * 2 #1234*2
713 end_y = BLANK_H * 6 #3508
714 cols = 2
715 rows = 6
716 width = BLANK_W #1234
717 height = BLANK_H #585
718
719 for j in range (start_y, end_y, height):
720 for i in range (start_x, end_x, width):
721 print_limits.append([i, j, None])
722
723 print ("PRINT LIMIST")
724 print (print_limits)
725
726
727 # dane dla siatki
728 def set_label_limits(self):
729 start_x = 0
730 start_y = 0
731 end_x = 500
732 end_y = 104 * 6 #117 * 6 #700
733 cols = 2
734 rows = 6
735 width = 250
736 height = 104 #117
737
738 for j in range (start_y, end_y, height):
739 for i in range (start_x, end_x, width):
740 label_limits.append([i, j])
741
742
743 def print_page(self, operation=None, context=None, page_nr=None):
744
745 ctx = context.get_cairo_context()
746
747 # make cairo ImageSurface from the png file
748 surface = cairo.ImageSurface.create_from_png('/tmp/postagelabels.png')
749
750 #ctx.set_operator(cairo.OPERATOR_SOURCE)
751 ctx.set_source_surface(surface)
752 ctx.paint ()
753 #ctx.set_operator(cairo.OPERATOR_OVER)
754 os.remove("/tmp/postagelabels.png");
755
756
757
758 #page = self.doc.get_page(page_nr)
759 #page.render(ctx)
760
761
762
763
764
765 def print_image(self, widget):
766 print ("PRINT LIMITS")
767 print (print_limits)
768
769 page_width = 210
770 page_height = 297
771 #page_margin_top = 20
772 dpi = 600
773 #_mm_dpi = 72 / 25.4
774
775
776
777
778 pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_size('/usr/share/postagelabels/szablon.png', 2480, 3508)
779
780 for i in range (12):
781 if print_limits[i][2] != None:
782
783 if i%2 == 1:
784 center_beam = 24
785 else:
786 center_beam = 0
787
788 label = GdkPixbuf.Pixbuf.new_from_file_at_size(print_limits[i][2], BLANK_W, BLANK_H)
789 #self.freeze_child_notify()
790 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)
791 #self.thaw_child_notify()
792
793 # z orginalnymi wielkościami nie chce drukowac
794 pixbuf2 = pixbuf.scale_simple(600, 855, GdkPixbuf.InterpType.BILINEAR)
795
796 pixbuf2.savev("/tmp/postagelabels.png","png", ["quality"], ["100"])
797 """
798 paper_size = Gtk.PaperSize.new_custom("1.0x", "2480 x 3508", 2480, 3508, Gtk.Unit.POINTS)
799
800 page_setup = Gtk.PageSetup()
801 page_setup.set_paper_size(paper_size)
802 pd = Gtk.PrintOperation()
803 #pd.set_embed_page_setup(True)
804 pd.set_default_page_setup(page_setup)
805 #pd.set_unit(Gtk.Unit.POINTS)
806 pd.set_n_pages(1)
807 pd.connect("draw_page", self.print_page)
808 result = pd.run(Gtk.PrintOperationAction.PRINT_DIALOG, None) # window zamisat None
809 print(result) # handle errors etc.
810 """
811
812
813 #ps= Gtk.PaperSize.new_custom("1.0x", "2480 x 3508", 2480, 3508, Gtk.Unit.POINTS)
814
815 ps = Gtk.PaperSize.new_custom("1.0x", "cc", page_width, page_height, Gtk.Unit.MM)
816 print_settings = Gtk.PrintSettings()
817 print_settings.set_resolution(dpi)
818
819 page_setup = Gtk.PageSetup()
820 page_setup.set_paper_size(ps)
821 page_setup.set_bottom_margin(0.0, Gtk.Unit.MM)
822 page_setup.set_left_margin(0.0, Gtk.Unit.MM)
823 page_setup.set_right_margin(0.0, Gtk.Unit.MM)
824 page_setup.set_top_margin(0.0, Gtk.Unit.MM)
825 page_setup.set_orientation(Gtk.PageOrientation.PORTRAIT)
826
827
828 print_operation = Gtk.PrintOperation()
829 print_operation.set_n_pages(1)
830 print_operation.set_default_page_setup(page_setup)
831 print_operation.set_print_settings(print_settings)
832 print_operation.connect("draw_page", self.print_page)
833 #print_operation.set_export_filename("example.pdf")
834
835 result = print_operation.run(Gtk.PrintOperationAction.PRINT_DIALOG, None) # window zamisat None
836
837 #result = print_operation.run(Gtk.PrintOperationAction.PREVIEW, None)
838 print(result)
839
840 def available_labels(self, name):
841
842 self.scrolled_window.remove(self.treeview)
843 grid.remove(self.scrolled_window)
844 self.liststore = Gtk.ListStore(str, str)
845
846 self.treeview.remove_column(self.column_text)
847
848 list_labels.append(name)
849 for o in list_labels:
850 self.liststore.append([o,""])
851
852 self.scrolled_window = Gtk.ScrolledWindow ()
853 self.scrolled_window.set_policy (Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
854
855 self.treeview = Gtk.TreeView(model=self.liststore)
856
857 self.renderer_text = Gtk.CellRendererText()
858 self.column_text = Gtk.TreeViewColumn("Dostępne etykiety", self.renderer_text, text=0)
859 self.treeview.append_column(self.column_text)
860
861 self.treeview.connect("button_release_event", self.mouse_selected)
862
863 self.scrolled_window.add (self.treeview)
864 grid.attach(self.scrolled_window,0,2,1,6)
865
866 self.show_all()
867
868
869 def init_ui(self):
870 global grid
871
872
873
874 self.image_new=None
875 self.props.border_width = 20
876
877 self.add(grid)
878
879 grid.set_row_spacing(10)
880 grid.set_column_spacing(10)
881 grid.set_column_homogeneous(True) # rozszerza kontrolke z utworami na resztę okna
882
883 action_group = Gtk.ActionGroup(name="my_actions")
884
885 self.add_file_menu_actions(action_group)
886 self.add_info_menu_actions(action_group)
887
888 uimanager = self.create_ui_manager()
889 uimanager.insert_action_group(action_group)
890
891 menubar = uimanager.get_widget("/MenuBar")
892 box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
893 box.pack_start(menubar, False, False, 0)
894
895
896 grid.attach(box, 0, 0, 2, 1)
897
898
899
900 event_box = Gtk.EventBox ()
901 event_box.connect ('button-press-event', self.onclick_in_pixbuf)
902 event_box.connect("motion-notify-event", self.on_mouse_move_in_pixbuf)
903 event_box.add_events(Gdk.EventMask.POINTER_MOTION_MASK)
904
905 self.set_label_limits()
906 self.set_print_limits()
907 frame = Gtk.Frame()
908
909
910 file_img_selected=get_resource_path("/usr/share/postagelabels/blank_small.png")
911 pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_scale(
912 filename=file_img_selected,
913 width=250,
914 height=117, #125
915 preserve_aspect_ratio=True)
916
917
918 self.all_img_template = Gtk.Grid()
919
920 self.image_template = []
921 self.image_template= [0 for i in range(12)]
922
923
924 left = 0
925 top = 1
926 top_next=False
927 multiplier = 0
928 n_multi = 1;
929 first = False
930 n = 2
931 for i in range(12):
932 print ("left: "+str(left)+" top: "+str(top))
933
934 if left == 2:
935 left = 0;
936 n_multi += 1
937 print ("multi: " +str(n_multi)+" %"+ str(n_multi%4))
938 if n_multi%2== 0:
939 if first == False:
940 multiplier = 1
941 first = True
942 multiplier += n
943 n *= 2
944 self.image_template[i] = Gtk.Image.new_from_pixbuf(pixbuf)
945 self.all_img_template.attach(self.image_template[i], left, top+multiplier, 1 , top+multiplier)
946 left += 1
947 if top_next == False:
948 top_next = True
949 pass
950 else:
951 top_next = False
952 top +=1
953
954 event_box.add(self.all_img_template)
955
956
957 frame.add(event_box)
958 grid.attach(frame,1,1,1,6)
959
960
961
962 # powiększenie etykiety po lewej stronie
963 file_img_selected=get_resource_path("/usr/share/postagelabels/blank_small.png")
964 pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_scale(
965 filename=file_img_selected,
966 width=500,
967 height=250,
968 preserve_aspect_ratio=True)
969
970 self.image2 = Gtk.Image.new_from_pixbuf(pixbuf)
971
972 grid.attach(self.image2,0,1,1,1)
973
974
975
976 self.liststore = Gtk.ListStore(str, str)
977 self.treeview = Gtk.TreeView(model=self.liststore)
978 self.treeview.connect("button_release_event", self.mouse_selected)
979
980
981
982 self.renderer_text = Gtk.CellRendererText()
983 self.column_text = Gtk.TreeViewColumn("Dostępne etykiety", self.renderer_text, text=0)
984 self.treeview.append_column(self.column_text)
985
986 self.scrolled_window = Gtk.ScrolledWindow ()
987 self.scrolled_window.set_policy (Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
988
989 self.scrolled_window.add (self.treeview)
990 grid.attach(self.scrolled_window,0,2,1,6)
991
992
993
994
995 self.set_border_width(10)
996 self.set_title("Naklejki Pocztowe")
997 self.set_default_size(1000, 655)
998 self.connect("destroy", Gtk.main_quit)
999
1000
1001
1002 win = MyWindow()
1003 win.show_all()
1004 Gtk.main()
1005
1006
1007
1008
1009
1010
1011
1012