NoPaste

PyGTKDeprecation

von HelsAett

SNIPPET_TEXT:
  1. #!/usr/bin/python
  2. # -*- coding: utf-8 -*-
  3. #########################################################################
  4. # File Name: test.py
  5. # Author: debian
  6. # mail: debian@debian-virtualbox
  7. # Created Time: 2024-05-02 14:19:41
  8. #########################################################################
  9.  
  10.  
  11. import gi
  12. gi.require_version("Gtk", "3.0")
  13. from gi.repository import Gtk, Gdk, Gio
  14. import os
  15. import sys
  16.  
  17. class PDFMergeWindow(Gtk.Window):
  18.     def __init__(self):
  19.         Gtk.Window.__init__(self, title="PDF Merge")
  20.         self.set_default_size(400, 200)
  21.         self.connect("destroy", Gtk.main_quit)
  22.  
  23.         self.selected_files = []
  24.  
  25.         self.file_chooser_button = Gtk.Button(label="Select PDF files")
  26.         self.file_chooser_button.connect("clicked", self.on_file_chooser_clicked)
  27.         self.file_chooser_button.set_hexpand(True)
  28.  
  29.         self.plus_button = Gtk.Button(label="+")
  30.         self.plus_button.connect("clicked", self.on_plus_clicked)
  31.         self.plus_button.set_hexpand(True)
  32.  
  33.         self.merge_button = Gtk.Button(label="Merge")
  34.         self.merge_button.connect("clicked", self.on_merge_clicked)
  35.         self.merge_button.set_hexpand(True)
  36.  
  37.         self.cancel_button = Gtk.Button(label="Cancel")
  38.         self.cancel_button.connect("clicked", self.on_cancel_clicked)
  39.         self.cancel_button.set_hexpand(True)
  40.  
  41.         self.file_list = Gtk.ListBox()
  42.         self.file_list.set_selection_mode(Gtk.SelectionMode.NONE)
  43.         self.file_list.set_hexpand(True)
  44.         self.file_list.set_vexpand(True)
  45.  
  46.         self.scrollable_window = Gtk.ScrolledWindow()
  47.         self.scrollable_window.add(self.file_list)
  48.  
  49.         self.grid = Gtk.Grid()
  50.         self.grid.attach(self.file_chooser_button, 0, 0, 1, 1)
  51.         self.grid.attach_next_to(self.plus_button, self.file_chooser_button, Gtk.PositionType.RIGHT, 1, 1)
  52.         self.grid.attach_next_to(self.scrollable_window, self.file_chooser_button, Gtk.PositionType.BOTTOM, 2, 1)
  53.         self.grid.attach_next_to(self.merge_button, self.scrollable_window, Gtk.PositionType.BOTTOM, 1, 1)
  54.         self.grid.attach_next_to(self.cancel_button, self.merge_button, Gtk.PositionType.RIGHT, 1, 1)
  55.  
  56.         self.add(self.grid)
  57.  
  58.         # Add initial files to the list if provided as command line arguments
  59.        if len(sys.argv) > 1:
  60.             initial_files = sys.argv[1:]
  61.             for filename in initial_files:
  62.                 self.add_file_to_list(filename)
  63.  
  64.     def on_file_chooser_clicked(self, button):
  65.         dialog = Gtk.FileChooserDialog(
  66.             "Please choose PDF files", self,
  67.             Gtk.FileChooserAction.OPEN,
  68.             (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
  69.              Gtk.STOCK_OPEN, Gtk.ResponseType.OK)
  70.         )
  71.         dialog.set_select_multiple(True)  # Allow multiple file selection
  72.        dialog.add_filter(Gtk.FileFilter())
  73.         dialog.get_filter().set_name("PDF files")
  74.         dialog.get_filter().add_pattern("*.pdf")
  75.  
  76.         response = dialog.run()
  77.         if response == Gtk.ResponseType.OK:
  78.             for filename in dialog.get_filenames():
  79.                 self.add_file_to_list(filename)
  80.         dialog.destroy()
  81.  
  82.     def add_file_to_list(self, filename):
  83.         self.selected_files.append(filename)
  84.         row = Gtk.ListBoxRow()
  85.         hbox = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=6)
  86.         label = Gtk.Label(label=filename, xalign=0)  # Left align the label
  87.        hbox.pack_start(label, True, True, 0)
  88.         row.add(hbox)
  89.         self.file_list.add(row)
  90.  
  91.     def on_plus_clicked(self, button):
  92.         self.on_file_chooser_clicked(button)
  93.  
  94.     def on_merge_clicked(self, button):
  95.         if len(self.selected_files) == 0:
  96.             self.show_error_dialog("No PDF files selected.")
  97.             return
  98.  
  99.         dialog = Gtk.FileChooserDialog(
  100.             "Save merged PDF as...", self,
  101.             Gtk.FileChooserAction.SAVE,
  102.             (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
  103.              Gtk.STOCK_SAVE, Gtk.ResponseType.OK)
  104.         )
  105.         dialog.add_filter(Gtk.FileFilter())
  106.         dialog.get_filter().set_name("PDF files")
  107.         dialog.get_filter().add_pattern("*.pdf")
  108.        
  109.         response = dialog.run()
  110.         if response == Gtk.ResponseType.OK:
  111.             output_file = dialog.get_filename()
  112.             self.save_merged_pdf(output_file)
  113.         dialog.destroy()
  114.  
  115.     def save_merged_pdf(self, output_file):
  116.         if os.path.exists(output_file):
  117.             response = self.show_overwrite_confirmation_dialog(output_file)
  118.             if response == Gtk.ResponseType.NO:
  119.                 return
  120.         self.merge_pdfs(output_file)
  121.  
  122.     def merge_pdfs(self, output_file):
  123.         cmd = ["pdfunite"] + self.selected_files + [output_file]
  124.         result = os.system(" ".join(cmd))
  125.         if result == 0:
  126.             self.show_info_dialog(f"PDFs merged successfully. Output file: {output_file}")
  127.             Gtk.main_quit()
  128.         else:
  129.             self.show_error_dialog("Failed to merge PDFs.")
  130.  
  131.     def on_cancel_clicked(self, button):
  132.         Gtk.main_quit()
  133.  
  134.     def show_error_dialog(self, message):
  135.         dialog = Gtk.MessageDialog(
  136.             transient_for=self,
  137.             flags=0,
  138.             message_type=Gtk.MessageType.ERROR,
  139.             buttons=Gtk.ButtonsType.OK,
  140.             text=message
  141.         )
  142.         dialog.run()
  143.         dialog.destroy()
  144.  
  145.     def show_info_dialog(self, message):
  146.         dialog = Gtk.MessageDialog(
  147.             transient_for=self,
  148.             flags=0,
  149.             message_type=Gtk.MessageType.INFO,
  150.             buttons=Gtk.ButtonsType.OK,
  151.             text=message
  152.         )
  153.         dialog.run()
  154.         dialog.destroy()
  155.  
  156.     def show_overwrite_confirmation_dialog(self, output_file):
  157.         dialog = Gtk.MessageDialog(
  158.             transient_for=self,
  159.             flags=0,
  160.             message_type=Gtk.MessageType.WARNING,
  161.             buttons=Gtk.ButtonsType.YES_NO,
  162.             text=f"File '{output_file}' already exists. Do you want to overwrite it?"
  163.         )
  164.         response = dialog.run()
  165.         dialog.destroy()
  166.         return response
  167.  
  168. # Beispiel für die Verwendung:
  169. win = PDFMergeWindow()
  170. win.show_all()
  171. Gtk.main()

Quellcode

Hier kannst du den Code kopieren und ihn in deinen bevorzugten Editor einfügen. PASTEBIN_DOWNLOAD_SNIPPET_EXPLAIN