1C_Bases/Main_v3.py

229 lines
10 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

import os
import tkinter as tk
from tkinter import messagebox
import pyodbc
import uuid
class RemoteFolderSelector(tk.Tk):
def __init__(self):
super().__init__()
self.title("Remote Folder and SQL Database Selector")
self.geometry("600x400")
# Создадим фреймы для лучшей компоновки элементов
self.frame_left = tk.Frame(self)
self.frame_left.grid(row=0, column=0, padx=10, pady=10, sticky="nsew")
self.frame_right = tk.Frame(self)
self.frame_right.grid(row=0, column=1, padx=10, pady=10, sticky="nsew")
# Сделаем окна масштабируемыми
self.grid_columnconfigure(0, weight=1)
self.grid_columnconfigure(1, weight=1)
self.grid_rowconfigure(0, weight=1)
# Переменные для выбора пользователя и базы данных
self.selected_user = None
self.base_name = None
self.server_name = None
self.ip_address = None
# Поле ввода IP-адреса
self.ip_label = tk.Label(self.frame_left, text="Enter IP (optional):")
self.ip_label.grid(row=0, column=0, padx=5, pady=5, sticky="w")
self.ip_entry = tk.Entry(self.frame_left, width=30)
self.ip_entry.grid(row=1, column=0, padx=5, pady=5, sticky="w")
self.connect_button = tk.Button(self.frame_left, text="Load Users", command=self.load_users)
self.connect_button.grid(row=2, column=0, padx=5, pady=5)
# Список пользователей
self.folder_listbox = tk.Listbox(self.frame_left, width=30, height=10)
self.folder_listbox.grid(row=3, column=0, padx=5, pady=5)
self.folder_listbox.bind("<Double-Button-1>", self.select_user)
# Поля для ввода данных SQL
self.server_label = tk.Label(self.frame_right, text="SQL Server:")
self.server_label.grid(row=0, column=0, padx=5, pady=5, sticky="w")
self.server_entry = tk.Entry(self.frame_right, width=30)
self.server_entry.grid(row=1, column=0, padx=5, pady=5, sticky="w")
self.server_entry.insert(0, "SERVERSQL")
self.login_label = tk.Label(self.frame_right, text="SQL Login:")
self.login_label.grid(row=2, column=0, padx=5, pady=5, sticky="w")
self.login_entry = tk.Entry(self.frame_right, width=30)
self.login_entry.grid(row=3, column=0, padx=5, pady=5, sticky="w")
self.login_entry.insert(0, "sa")
self.password_label = tk.Label(self.frame_right, text="SQL Password:")
self.password_label.grid(row=4, column=0, padx=5, pady=5, sticky="w")
self.password_entry = tk.Entry(self.frame_right, show="*", width=30)
self.password_entry.grid(row=5, column=0, padx=5, pady=5, sticky="w")
self.sql_button = tk.Button(self.frame_right, text="Load Databases", command=self.load_databases)
self.sql_button.grid(row=6, column=0, padx=5, pady=5)
# Список баз данных
self.db_listbox = tk.Listbox(self.frame_right, width=30, height=10)
self.db_listbox.grid(row=7, column=0, padx=5, pady=5)
self.db_listbox.bind("<Double-Button-1>", self.select_database)
# Кнопка добавления базы
self.add_button = tk.Button(self.frame_left, text="Add to ibases.v8i", command=self.add_database_to_ibases)
self.add_button.grid(row=4, column=0, padx=5, pady=5)
# Список баз из файла ibases.v8i
self.ibases_listbox = tk.Listbox(self.frame_left, width=30, height=10)
self.ibases_listbox.grid(row=5, column=0, padx=5, pady=5)
# Загрузка пользователей с локального компьютера по умолчанию
self.load_users()
def load_users(self):
"""Загружаем пользователей с указанного IP-адреса или локального ПК."""
self.ip_address = self.ip_entry.get()
if not self.ip_address: # Если IP не указан, используем локальный ПК
local_path = r"C:\Users"
self.load_local_users(local_path)
else:
try:
# Используем указанный IP для подключения к удалённому ПК
remote_path = f"\\\\{self.ip_address}\\C$\\Users"
self.load_remote_users(remote_path)
except Exception as e:
messagebox.showerror("Error", f"Could not load users: {str(e)}")
def load_local_users(self, path):
"""Загружаем список пользователей с локального ПК."""
try:
folders = os.listdir(path)
self.folder_listbox.delete(0, tk.END)
for folder in folders:
if os.path.isdir(os.path.join(path, folder)):
self.folder_listbox.insert(tk.END, folder)
except Exception as e:
messagebox.showerror("Error", f"Could not load local users: {str(e)}")
def load_remote_users(self, remote_path):
"""Загружаем список пользователей с удалённого ПК."""
try:
folders = os.listdir(remote_path)
self.folder_listbox.delete(0, tk.END)
for folder in folders:
if os.path.isdir(os.path.join(remote_path, folder)):
self.folder_listbox.insert(tk.END, folder)
except Exception as e:
messagebox.showerror("Error", f"Could not load remote users: {str(e)}")
def select_user(self, event):
"""Обработчик двойного клика для выбора пользователя и загрузки баз из файла ibases.v8i."""
selected_index = self.folder_listbox.curselection()
if selected_index:
self.selected_user = self.folder_listbox.get(selected_index)
messagebox.showinfo("User Selected", f"Selected User: {self.selected_user}")
self.load_ibases()
def load_ibases(self):
"""Загружаем базы данных из файла ibases.v8i выбранного пользователя."""
try:
# Определяем путь к файлу ibases.v8i
if not self.ip_address:
base_path = f"C:\\Users\\{self.selected_user}\\AppData\\Roaming\\1C\\1CEStart"
else:
base_path = f"\\\\{self.ip_address}\\C$\\Users\\{self.selected_user}\\AppData\\Roaming\\1C\\1CEStart"
ibases_path = os.path.join(base_path, "ibases.v8i")
if not os.path.exists(ibases_path):
messagebox.showinfo("Info", f"No ibases.v8i file found for user: {self.selected_user}")
return
with open(ibases_path, "r", encoding="utf-8") as file:
lines = file.readlines()
# Ищем строки с названиями баз данных (начинаются с [)
databases = [line.strip()[1:-1] for line in lines if line.startswith("[")]
if not databases:
messagebox.showinfo("Info", "No databases found in ibases.v8i")
return
# Сортируем базы в алфавитном порядке и выводим их в Listbox
databases.sort()
self.ibases_listbox.delete(0, tk.END)
for db in databases:
self.ibases_listbox.insert(tk.END, db)
except Exception as e:
messagebox.showerror("Error", f"Could not load databases from ibases.v8i: {str(e)}")
def load_databases(self):
"""Подключаемся к SQL серверу и загружаем список баз данных."""
server = self.server_entry.get()
login = self.login_entry.get()
password = self.password_entry.get()
try:
connection_string = f"DRIVER={{SQL Server}};SERVER={server};UID={login};PWD={password};"
connection = pyodbc.connect(connection_string)
cursor = connection.cursor()
cursor.execute("SELECT name FROM sys.databases")
databases = cursor.fetchall()
self.db_listbox.delete(0, tk.END)
for db in databases:
self.db_listbox.insert(tk.END, db[0])
connection.close()
except Exception as e:
messagebox.showerror("Error", f"Could not load databases: {str(e)}")
def select_database(self, event):
"""Обработчик двойного клика для выбора базы данных."""
selected_index = self.db_listbox.curselection()
if selected_index:
self.base_name = self.db_listbox.get(selected_index)
messagebox.showinfo("Database Selected", f"Selected Database: {self.base_name}")
def add_database_to_ibases(self):
"""Добавляем базу данных в файл ibases.v8i."""
if not self.base_name:
messagebox.showerror("Error", "No database selected.")
return
try:
if not self.ip_address:
base_path = f"C:\\Users\\{self.selected_user}\\AppData\\Roaming\\1C\\1CEStart"
else:
base_path = f"\\\\{self.ip_address}\\C$\\Users\\{self.selected_user}\\AppData\\Roaming\\1C\\1CEStart"
ibases_path = os.path.join(base_path, "ibases.v8i")
if not os.path.exists(ibases_path):
with open(ibases_path, "w", encoding="utf-8") as file:
file.write(f"[{self.base_name}]\n")
else:
with open(ibases_path, "a", encoding="utf-8") as file:
file.write(f"[{self.base_name}]\n")
messagebox.showinfo("Success", f"Database {self.base_name} added to ibases.v8i")
# Перезагружаем список баз данных после добавления
self.load_ibases()
except Exception as e:
messagebox.showerror("Error", f"Could not add database to ibases.v8i: {str(e)}")
if __name__ == "__main__":
app = RemoteFolderSelector()
app.mainloop()