Advertisement
MizunoBrasil

Janela de Favoritos com edição e exclusão (Python)

Jun 13th, 2023
1,170
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 14.12 KB | Source Code | 0 0
  1. #EDITADO EM 13/06/2023 ÀS 21:56
  2.  
  3. import tkinter as tk
  4. from tkinter import ttk
  5. from tkinter import messagebox
  6. import webbrowser
  7. import csv
  8. from bs4 import BeautifulSoup
  9. import requests
  10. from datetime import datetime
  11. import os
  12. import ctypes
  13.  
  14.  
  15. # Função para minimizar a janela do terminal
  16. def minimize_window():
  17.     # Obtém o identificador da janela do terminal
  18.     hwnd = ctypes.windll.kernel32.GetConsoleWindow()
  19.  
  20.     # Minimiza a janela do terminal
  21.     ctypes.windll.user32.ShowWindow(hwnd, 6)  # 6 representa o comando para minimizar a janela
  22.  
  23.     # Exibe mensagem informando que o programa está sendo executado
  24.     print("O programa está sendo executado. A janela do terminal será minimizada.")
  25.  
  26.  
  27. # Minimiza a janela do terminal
  28. minimize_window()
  29.  
  30.  
  31. class URLManager:
  32.     def __init__(self, root):
  33.         self.root = root
  34.         self.current_sort_column = None  # Manter o controle da coluna atualmente ordenada
  35.         self.current_sort_direction = True  # True para ordem crescente, False para ordem decrescente
  36.         self.create_main_window()
  37.  
  38.     def create_main_window(self):
  39.         self.root.title("Gerenciador de Favoritos")
  40.         window_width = 1366
  41.         window_height = 768
  42.  
  43.         screen_width = self.root.winfo_screenwidth()
  44.         screen_height = self.root.winfo_screenheight()
  45.  
  46.         x = (screen_width - window_width) // 2
  47.         y = (screen_height - window_height) // 2
  48.  
  49.         self.root.geometry(f"{window_width}x{window_height}+{x}+{y}")
  50.  
  51.         self.create_treeview()
  52.         self.create_menu()
  53.  
  54.         # Adicionar a mensagem no canto esquerdo da janela
  55.         message_label = tk.Label(self.root, text="Gerenciador de Favoritos (2023)", anchor="w", padx=10, pady=5)
  56.         message_label.pack(side="left", anchor="sw")
  57.  
  58.     def create_treeview(self):
  59.         tree_frame = ttk.Frame(self.root)
  60.         tree_frame.pack(fill="both", expand=True)
  61.  
  62.         self.tree = ttk.Treeview(tree_frame, columns=("Title", "URL", "Categoria", "Data e Hora"), show="headings")
  63.         self.tree.heading("Title", text="Título", command=lambda: self.sort_by_column("Title"))
  64.         self.tree.heading("URL", text="URL")
  65.         self.tree.heading("Categoria", text="Categoria", command=lambda: self.sort_by_column("Categoria"))
  66.         self.tree.heading("Data e Hora", text="Data e Hora", command=lambda: self.sort_by_column("Data e Hora"))
  67.         self.tree.pack(side="left", fill="both", expand=True)
  68.  
  69.         scrollbar = ttk.Scrollbar(tree_frame, orient="vertical", command=self.tree.yview)
  70.         scrollbar.pack(side="right", fill="y")
  71.         self.tree.configure(yscrollcommand=scrollbar.set)
  72.  
  73.         self.tree.configure(height=10)
  74.         self.tree.column("#0", width=0)
  75.         self.tree.column("Title", width=300)
  76.         self.tree.column("URL", width=400)
  77.         self.tree.column("Categoria", width=150)
  78.         self.tree.column("Data e Hora", width=200)
  79.  
  80.         self.load_data()
  81.  
  82.         self.tree.bind("<Double-1>", self.open_url)
  83.  
  84.     def create_menu(self):
  85.         menu_bar = tk.Menu(self.root)
  86.         self.root.config(menu=menu_bar)
  87.  
  88.         acoes_menu = tk.Menu(menu_bar, tearoff=0)
  89.         menu_bar.add_cascade(label="Ações", menu=acoes_menu)
  90.         acoes_menu.add_command(label="Cadastrar", command=self.cadastrar)
  91.         acoes_menu.add_command(label="Editar", command=self.editar)
  92.         acoes_menu.add_command(label="Excluir", command=self.excluir)
  93.         acoes_menu.add_separator()
  94.         acoes_menu.add_command(label="Exportar para HTML", command=self.exportar_para_html)
  95.         acoes_menu.add_command(label="Sair", command=self.sair)
  96.  
  97.     def load_data(self):
  98.         try:
  99.             with open('sites.csv', 'r', encoding='utf-8') as file:
  100.                 reader = csv.reader(file)
  101.                 for row in reader:
  102.                     if len(row) >= 4:
  103.                         title = row[0]
  104.                         url = row[1]
  105.                         category = row[2]
  106.                         timestamp = row[3]
  107.                         self.tree.insert('', 'end', values=(title, url, category, timestamp))
  108.         except FileNotFoundError:
  109.             messagebox.showerror("Erro", "Arquivo 'sites.csv' não encontrado.")
  110.  
  111.     def cadastrar(self):
  112.         cadastrar_window = tk.Toplevel(self.root)
  113.         cadastrar_window.title("Cadastrar URL")
  114.         cadastrar_window.geometry("+%d+%d" % (
  115.             (self.root.winfo_screenwidth() - cadastrar_window.winfo_reqwidth()) // 2,
  116.             (self.root.winfo_screenheight() - cadastrar_window.winfo_reqheight()) // 2))
  117.  
  118.         url_label = tk.Label(cadastrar_window, text="URL:")
  119.         url_label.pack()
  120.         url_entry = tk.Entry(cadastrar_window, width=100)
  121.         url_entry.pack()
  122.  
  123.         category_label = tk.Label(cadastrar_window, text="Categoria:")
  124.         category_label.pack()
  125.         category_combobox = ttk.Combobox(cadastrar_window, values=[
  126.             "Adulto", "Compras", "Cinema", "Comportamento", "Curiosidades", "Downloads", "Downloads-Filmes", "Engraçado",
  127.             "Tecnologia", "iOS", "Android", "Música", "Notícias", "Política", "Programação", "Streaming", "Utilitários",
  128.             "Variedades", "Veículos", "Youtube"])
  129.  
  130.         category_combobox.pack()
  131.  
  132.         url_entry.bind("<Button-3>", lambda event: url_entry.focus_set())
  133.         url_entry_menu = tk.Menu(tearoff=0)
  134.         url_entry_menu.add_command(label="Colar", command=lambda: url_entry.event_generate("<<Paste>>"))
  135.         url_entry_menu.add_command(label="Copiar", command=lambda: url_entry.event_generate("<<Copy>>"))
  136.         url_entry_menu.add_command(label="Recortar", command=lambda: url_entry.event_generate("<<Cut>>"))
  137.         url_entry.bind("<Button-3>", lambda event: url_entry_menu.post(event.x_root, event.y_root))
  138.  
  139.         salvar_button = tk.Button(cadastrar_window, text="Cadastrar",
  140.                                   command=lambda: self.salvar_url(url_entry, category_combobox, cadastrar_window))
  141.         salvar_button.pack()
  142.  
  143.     def salvar_url(self, url_entry, category_combobox, cadastrar_window):
  144.         url = url_entry.get()
  145.         category = category_combobox.get()
  146.         if url and category:
  147.             try:
  148.                 response = requests.get(url)
  149.                 soup = BeautifulSoup(response.text, 'html.parser')
  150.                 title = soup.title.string
  151.                 current_time = datetime.now().strftime("%d/%m/%Y %H:%M:%S")
  152.  
  153.                 with open('sites.csv', 'a', newline='', encoding='utf-8') as file:
  154.                     writer = csv.writer(file)
  155.                     writer.writerow([title, url, category, current_time])
  156.  
  157.                 self.tree.insert('', 'end', values=(title, url, category, current_time))
  158.                 url_entry.delete(0, 'end')
  159.  
  160.                 messagebox.showinfo("Cadastrar", "URL cadastrada com sucesso.")
  161.                 cadastrar_window.destroy()
  162.  
  163.             except:
  164.                 messagebox.showerror("Erro", "Erro ao acessar a URL.")
  165.  
  166.         else:
  167.             messagebox.showerror("Erro", "Digite uma URL e selecione uma categoria.")
  168.  
  169.     def excluir(self):
  170.         item = self.tree.selection()
  171.         if item:
  172.             confirm = messagebox.askyesno("Confirmação", "Deseja realmente excluir a URL selecionada?")
  173.             if confirm:
  174.                 selected_item = self.tree.selection()[0]
  175.                 title = self.tree.item(selected_item)['values'][0]
  176.                 url = self.tree.item(selected_item)['values'][1]
  177.                 self.tree.delete(selected_item)
  178.                 messagebox.showinfo("Exclusão", "URL excluída com sucesso.")
  179.  
  180.                 self.remove_registro_csv(title, url)
  181.         else:
  182.             messagebox.showerror("Erro", "Selecione uma URL para excluir.")
  183.  
  184.     def editar(self):
  185.         item = self.tree.selection()
  186.         if item:
  187.             selected_item = self.tree.selection()[0]
  188.             old_title = self.tree.item(selected_item)['values'][0]
  189.             old_url = self.tree.item(selected_item)['values'][1]
  190.             old_category = self.tree.item(selected_item)['values'][2]
  191.  
  192.             edit_window = tk.Toplevel(self.root)
  193.             edit_window.title("Editar URL")
  194.             edit_window.geometry("+%d+%d" % (
  195.                 (self.root.winfo_screenwidth() - edit_window.winfo_reqwidth()) // 2,
  196.                 (self.root.winfo_screenheight() - edit_window.winfo_reqheight()) // 2))
  197.  
  198.             title_label = tk.Label(edit_window, text="Título:")
  199.             title_label.pack()
  200.             title_entry = tk.Entry(edit_window, width=100)
  201.             title_entry.insert(0, old_title)
  202.             title_entry.pack()
  203.  
  204.             url_label = tk.Label(edit_window, text="URL:")
  205.             url_label.pack()
  206.             url_entry = tk.Entry(edit_window, width=100)
  207.             url_entry.insert(0, old_url)
  208.             url_entry.pack()
  209.  
  210.             category_label = tk.Label(edit_window, text="Categoria:")
  211.             category_label.pack()
  212.             category_combobox = ttk.Combobox(edit_window, values=[
  213.                 "Adulto", "Compras", "Cinema", "Comportamento", "Curiosidades", "Downloads", "Downloads-Filmes", "Engraçado",
  214.                 "Tecnologia", "iOS", "Android", "Música", "Notícias", "Política", "Programação", "Streaming", "Utilitários",
  215.                 "Variedades", "Veículos", "Youtube"])
  216.             category_combobox.set(old_category)
  217.             category_combobox.pack()
  218.  
  219.             salvar_button = tk.Button(edit_window, text="Salvar",
  220.                                     command=lambda: self.salvar_edicao(title_entry, url_entry, category_combobox, old_title, old_url, edit_window))
  221.             salvar_button.pack()
  222.  
  223.         else:
  224.             messagebox.showerror("Erro", "Selecione uma URL para editar.")
  225.  
  226.     def salvar_edicao(self, title_entry, url_entry, category_combobox, old_title, old_url, edit_window):
  227.         new_title = title_entry.get()
  228.         new_url = url_entry.get()
  229.         new_category = category_combobox.get()
  230.  
  231.         if new_title and new_url and new_category:
  232.             selected_item = self.tree.selection()[0]
  233.             self.tree.item(selected_item, values=(new_title, new_url, new_category))
  234.  
  235.             edit_window.destroy()
  236.             self.atualizar_registro_csv(old_title, old_url, new_title, new_url, new_category)
  237.         else:
  238.             messagebox.showerror("Erro", "Preencha todos os campos.")
  239.  
  240.     def remove_registro_csv(self, title, url):
  241.         rows = []
  242.         with open('sites.csv', 'r', encoding='utf-8') as file:
  243.             reader = csv.reader(file)
  244.             for row in reader:
  245.                 if row[0] != title or row[1] != url:
  246.                     rows.append(row)
  247.  
  248.         with open('sites.csv', 'w', newline='', encoding='utf-8') as file:
  249.             writer = csv.writer(file)
  250.             writer.writerows(rows)
  251.  
  252.     def atualizar_registro_csv(self, old_title, old_url, new_title, new_url, new_category):
  253.         rows = []
  254.         with open('sites.csv', 'r', encoding='utf-8') as file:
  255.             reader = csv.reader(file)
  256.             for row in reader:
  257.                 if row[0] == old_title and row[1] == old_url:
  258.                     current_time = datetime.now().strftime("%d/%m/%Y %H:%M:%S")
  259.                     rows.append([new_title, new_url, new_category, current_time])
  260.                 else:
  261.                     rows.append(row)
  262.  
  263.         with open('sites.csv', 'w', newline='', encoding='utf-8') as file:
  264.             writer = csv.writer(file)
  265.             writer.writerows(rows)
  266.  
  267.     def open_url(self, event):
  268.         items = self.tree.selection()
  269.         if not items:
  270.             return  # Não faz nada se nenhum item estiver selecionado
  271.  
  272.         item = items[0]
  273.         url = self.tree.item(item)['values'][1]
  274.         webbrowser.open(url)
  275.  
  276.     def exportar_para_html(self):
  277.         current_time = datetime.now().strftime("%d/%m/%Y %H:%M:%S")
  278.         filename = f"{current_time.replace('/', '_').replace(':', '_')}.html"
  279.         links = []
  280.  
  281.         with open('sites.csv', 'r', encoding='utf-8') as file:
  282.             reader = csv.reader(file)
  283.             for row in reader:
  284.                 url = row[1]
  285.                 link_html = f"<a href='{url}'>{url}</a>"
  286.                 links.append(link_html)
  287.  
  288.         html_content = f"""
  289.        <!DOCTYPE html>
  290.        <html>
  291.        <head>
  292.            <title>Links</title>
  293.        </head>
  294.        <body>
  295.            <h1>Links</h1>
  296.            <ul>
  297.                {''.join(f'<li>{link}</li>' for link in links)}
  298.            </ul>
  299.            <p>Exportado em {current_time}</p>
  300.        </body>
  301.        </html>
  302.        """
  303.  
  304.         current_dir = os.path.dirname(os.path.abspath(__file__))
  305.         file_path = os.path.join(current_dir, filename)
  306.  
  307.         with open(file_path, 'w', encoding='utf-8') as file:
  308.             file.write(html_content)
  309.  
  310.         messagebox.showinfo("Exportar para HTML", f"Arquivo HTML '{filename}' gerado com sucesso!")
  311.  
  312.     def sair(self):
  313.         self.root.quit()
  314.  
  315.     def sort_by_column(self, column):
  316.         if column == "URL":
  317.             return  # Não faz nada se a coluna selecionada for "URL"
  318.  
  319.         if self.current_sort_column == column:
  320.             # Alternar a direção da ordenação
  321.             self.current_sort_direction = not self.current_sort_direction
  322.         else:
  323.             # Estabelecer a coluna atualmente ordenada e a direção como padrão
  324.             self.current_sort_column = column
  325.             self.current_sort_direction = True
  326.  
  327.         items = self.tree.get_children()
  328.         sorted_items = sorted(items, key=lambda x: self.get_column_value(x, column), reverse=not self.current_sort_direction)
  329.         for index, item in enumerate(sorted_items, start=0):
  330.             self.tree.move(item, '', index)
  331.  
  332.     def get_column_value(self, item, column):
  333.         values = self.tree.item(item)['values']
  334.         if column == "Title":
  335.             return values[0]
  336.         elif column == "URL":
  337.             return values[1]
  338.         elif column == "Categoria":
  339.             return values[2]
  340.         elif column == "Data e Hora":
  341.             return values[3]
  342.         else:
  343.             return None
  344.  
  345.  
  346. root = tk.Tk()
  347. url_manager = URLManager(root)
  348. root.mainloop()
  349.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement