Dullyboy
27/07/2012, 18:59
Windows no te sé decir, así que solo puedo hablarte de Linux.
En Linux hay dos directorios principales para configuraciones:
/etc Aquí está la confiuguración de los programas "importantes" de tu ordenador. Por ejemplo, servidores de archivos, web, seguridad... Lo que se ejecuta en el ordenador sin que nadie le diga nada. Si es un ordenador casero, lo más probable es que la configuración estándar sea la más correcta así que a menos que tengas unas necesidades muy especiales con los servidores, no hace falta que lo conserves.
/home/dulllyboy Aquí está la configuración de los programas que usas tú, además de todos tus archivos personales. Dentro de este directorio hace unos años las configuraciones estaban en directorios separados con nombres que empiezan con un punto (estos directorios suelen ocultarse en gestores de archivos y no salen a menos que lo configures explícitamente). Los programas más antiguos aún lo hace así. Por ejemplo, la configuración de firefox está en el directorio:
/home/dullyboy/.mozilla
Aunque últimamemente se está centralizando la configuración en dos directorios (cuál de estos dos exactamente depende del programa)
/home/dullyboy/.local
/home/dullyboy/.config
Por ejemplo, la configuración de chrome está en
/home/dullyboy/.config/google-chrome
Mientras que la configuración de SuperMeatboy, por decir algún juego, está en:
/home/dullyboy/.local/share/SuperMeatBoy
Resumiendo: si tu ordenador es casero, solo te recomiendo conservar un directorio:
/home/dullyboy
De hecho, se recomienda que este directorio esté en una partición separada o en un disco duro propio. Así puedes reinstalar todo el sistema, o llevártelo a un nuevo ordenador, manteniendo todos tus datos y configuraciones.
Vale, lujo, entonces en linux no hace falta programar nada porque está hecho como Crom manda, algo menos de que preocuparse y un argumento más para hacer el cambio. Siendo así también también estarán las configuraciones de las extensiones de firefox ¿no? (el historial, favoritos y sesiones no me preocupa porque lo tengo sincronizado). Esto es lo más gordo, luego si hay que buscar donde guarda la configuración del escritorio tampoco es mucho problema.
Parecido al Norton Ghost esta el Clonezilla (http://clonezilla.org/) pero creo que este tipo de programas no es lo que busca el compañero.
Si no he entendido mal, él quiere, en un PC nuevo con su windows instalado, poder pasar los programas que usa con su configuración tal y como están ahora mismo en el PC que va a 'jubilar'.
Si es eso, el Norton no el sirve :)
También quería hacer esto para hacer más rápidas los formateos y reinstalaciones y ahí si me serviría hacer una imagen, pero claro ahora al ser cambio de equipo no hay tu tia :). Y si mi puedo hacer un instalador de drivers y programas (que se puedan actualizar de una vez a otra) para no tener que hacerlo yo también sería manteca .
Dullyboy
16/08/2012, 20:41
Hasta aquí llegué sin preguntar, que ya he puesto una pregunta en stackoverflow (http://stackoverflow.com/questions/11991707/how-can-i-remove-duplicated-items-from-an-objectlistview-wxpython) :D.
A base de copy/paste/edit he llegado a esto, pero me estoy atascando en varias cosas:
- Quitar las entradas repetidas en la lista (lo que he preguntado en stackoverflow).
- No soy capaz de bindear una tecla con los splitters.
- Añadir entradas en la lista desde el Filedialog.
(Las acciones de los botones, que cambie de lista en función del programa seleccionado y demás cosas que están si hacer las estoy dejando para después, aunque aún no se si sabré hacerlas :))
import os
import stat
import time
import sys
try:
import wx
except ImportError:
raise ImportError,"Se requiere el modulo wxPython"
try:
from ObjectListView import ObjectListView, ColumnDefn
except ImportError:
raise ImportError,"Se requiere el modulo ObjectListView"
wildcard = "Python source (*.py; *.pyc)|*.py;*.pyc|" \
"All files (*.*)|*.*"
#Nombres de los botones
ID_NEW = 1
ID_RENAME = 2
ID_DELETE = 3
ID_EDIT = 4
ID_SAVE = 5
ID_RESTORE = 6
# Declare GUI Constants
MENU_FILE_EXIT = wx.NewId()
DRAG_SOURCE = wx.NewId()
XX = 0
################DEBUG CODE##########################
class LogText(wx.Panel):
def __init__(self, parent, X):
wx.Panel.__init__(self, parent)
self.X = X
# Add a panel so it looks the correct on all platforms
self.log = wx.TextCtrl(self, wx.ID_ANY, size=(300,100),
style = wx.TE_MULTILINE|wx.TE_READONLY|wx.HSCROLL)
self.btn = wx.Button(self, wx.ID_ANY, 'Push me!')
self.btn.Bind(wx.EVT_BUTTON, self.onButton, self.btn)
# Add widgets to a sizer
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(self.log, 1, wx.ALL|wx.EXPAND, 5)
sizer.Add(self.btn, 0, wx.ALL|wx.CENTER, 5)
self.SetSizer(sizer)
# redirect text here
sys.stdout=RedirectText(self.log)
def onButton(self, event):
print self.X
class RedirectText(object):
def __init__(self,aWxTextCtrl):
self.out=aWxTextCtrl
def write(self,string):
self.out.WriteText(string)
################DEBUG CODE##########################
################################################## ######################
class MyFileDropTarget(wx.FileDropTarget):
""""""
#----------------------------------------------------------------------
def __init__(self, window):
"""Constructor"""
wx.FileDropTarget.__init__(self)
self.window = window
#----------------------------------------------------------------------
def OnDropFiles(self, x, y, filenames):
"""
When files are dropped, update the display
"""
self.entriesList = list() # Actual dropped file entries; duplicates are avoided.
self.haveEntries = False # Tracks actual dropped file entries, but not help entries.
self.window.updateDisplay(filenames)
################################################## ######################
class FileInfo(object):
""""""
#----------------------------------------------------------------------
def __init__(self, path, date_created, date_modified, size):
"""Constructor"""
self.name = os.path.basename(path)
self.path = path
self.date_created = date_created
self.date_modified = date_modified
self.size = size
#Panel de los archivos y directorios.
################################################## ######################
class FileList(wx.Panel):
""""""
#----------------------------------------------------------------------
def __init__(self, parent):
"""Constructor"""
wx.Panel.__init__(self, parent)
self.file_list = []
# For row deletions.
self.Bind(wx.EVT_LEFT_DOWN, self.OnFindCurrentRow)
self.Bind(wx.EVT_RIGHT_DOWN, self.OnRightDown)
self.currRow = None
self.numCols = -1
self.olv = ObjectListView(self, style=wx.LC_REPORT|wx.SUNKEN_BORDER)
self.olv.SetEmptyListMsg("No hay carpetas y/o archivos seleccionados")
self.olv.SetEmptyListMsgFont(wx.FFont(24, wx.DEFAULT, face="Tekton"))
self.olv.SetDropTarget(MyFileDropTarget(self))
self.setFiles()
self.RemoveDuplicated(self.olv)
# Create buttons
self.vbox = wx.BoxSizer(wx.VERTICAL)
self.hbox = wx.BoxSizer(wx.HORIZONTAL)
self.btnPanel = wx.Panel(self, -1)
self.anyd = wx.Button(self.btnPanel , label='Añadir', size=(90, 30))
self.anyd.Bind(wx.EVT_BUTTON, self.onOpenFile)
self.dlt = wx.Button(self.btnPanel , label='Eliminar', size=(90, 30))
self.dlt.Bind(wx.EVT_BUTTON, self.onOpenFile)
self.sv = wx.Button(self.btnPanel, label='Guardar', size=(90, 30))
self.sv.Bind(wx.EVT_BUTTON, self.onOpenFile)
self.bt = wx.Button(self.btnPanel, label='Borrar todo', size=(90, 30))
self.sv.Bind(wx.EVT_BUTTON, self.onOpenFile)
self.hbox.Add(self.anyd, 0, wx.CENTER, 5)
self.hbox.Add(self.dlt, 0, wx.CENTER, 5)
self.hbox.Add(self.sv, 0, wx.CENTER, 5)
self.hbox.Add(self.bt, 0, wx.CENTER, 5)
self.vbox.Add(self.olv, 1, wx.ALL | wx.EXPAND, 5)
self.btnPanel.SetSizer(self.hbox)
self.vbox.Add(self.btnPanel, 0.6, wx.CENTER | wx.CENTER, 10)
self.vbox.Add((-1,5.))
self.SetSizer(self.vbox)
def RemoveDuplicated(self, X):
for all in X:
Counter = -1
for B in X:
if X.path(A) == X.path(B):
Counter = Counter + 1
if Counter >= 1:
RemoveObject(A)
def onOpenFile(self, event):
"""
Create and show the Open FileDialog
"""
dlg = wx.FileDialog(
self, message="Elige los archivos o carpetas que quieras añadir",
defaultFile="",
wildcard=wildcard,
style=wx.OPEN | wx.MULTIPLE | wx.CHANGE_DIR
)
if dlg.ShowModal() == wx.ID_OK:
self.olv.AddObject(dlg.GetPaths())
dlg.Destroy()
def OnFindCurrentRow( self, event ) :
""" Triggered on every wx.EVT_LEFT_DOWN.
Is also called by OnRightDown{}.
"""
# Deselect any previously selected row.
if (self.currRow is not None) :
self.Select( self.currRow, False )
# Select the currently clicked row.
row, _ignoredFlags = self.HitTest( event.GetPosition() )
self.currRow = row # Save row index for later use.
self.Select( row )
#end def
#---------------------------------- FilesDirsListCtrl
def OnRightDown( self, event) :
pos = event.GetPosition()
mess = "Mouse is at " + str(pos)
Principal.SetTitle(mess)
event.Skip()
menu = wx.Menu()
menuItem_delete = menu.Append( -1, 'Delete this entry')
self.Bind( wx.EVT_MENU, self.OnDeleteRow, menuItem_delete )
# Select row
self.OnFindCurrentRow( event )
self.PopupMenu( menu, event.GetPosition() )
#end def
#---------------------------------- FilesDirsListCtrl
def OnDeleteRow( self, event ) :
if (self.currRow >= 0) :
# This row data must have been appended to self.entriesList.
#----- SANITY CHECK
# self.GetItemCount() may be greater than self.numEntries due to help messages.
assert( self.numEntries == len( self.entriesList ) )
#-----
# Retreive the selected raw-row-data as a list of lists.
allSelectedRowData = self.GetAllSelectedRowData()
if (len( allSelectedRowData ) >= 1) :
#-----
rawRowData = allSelectedRowData[ 0 ] # There can be only a single row selected.
lineIdx = rawRowData[ 0 ]
unknownData = rawRowData[ 1 ]
textDataTuple = tuple( rawRowData[ 2: ] ) # Make same type as in self.entriesList
if self.numEntries :
try :
entryListIndex = None
entryListIndex = self.entriesList.index( textDataTuple )
except ValueError :
print '#### ERROR: textDataTuple NOT FOUND in self.entriesList :'
print ' ', textDataTuple
print
return
#-----
#end try
# Delete this row item from [ self.entriesList ].
del self.entriesList[ entryListIndex ]
# Update the status vars.
self.numEntries -= 1
if (self.numEntries < 1) :
self.haveEntries = False
self.Append( self.HelpTextTuple )
# Finally, detete the textList row item.
self.DeleteItem( self.currRow )
#end if self.numEntries
#end if (len( allSelectedRowData ) > 0)
#end if (self.currRow >= 0)
#end OnDeleteRow def
#----------------------------------------------------------------------
def updateDisplay(self, file_list):
""""""
for path in file_list:
file_stats = os.stat(path)
creation_time = time.strftime("%m/%d/%Y %I:%M %p",
time.localtime(file_stats[stat.ST_CTIME]))
modified_time = time.strftime("%m/%d/%Y %I:%M %p",
time.localtime(file_stats[stat.ST_MTIME]))
file_size = file_stats[stat.ST_SIZE]
if file_size > 1024:
file_size = file_size / 1024.0
file_size = "%.2f KB" % file_size
self.file_list.append(FileInfo(path,
creation_time,
modified_time,
file_size))
self.olv.SetObjects(self.file_list)
#----------------------------------------------------------------------
def setFiles(self):
""""""
self.olv.SetColumns([
ColumnDefn("Nombre", "left", 220, "name", minimumWidth = 30),
ColumnDefn("Ruta", "left", 220, "path", minimumWidth = 30),
ColumnDefn("Fecha de creación", "left", 150, "date_created", minimumWidth = 30),
ColumnDefn("Fecha de modificación", "left", 150, "date_modified", minimumWidth = 30),
ColumnDefn("Tamaño", "left", 100, "size", minimumWidth = 30)
])
self.olv.SetObjects(self.file_list)
#Lista de aplicaciones y botones.
class ListBox(wx.Panel):
def __init__(self, parent):
wx.Panel.__init__(self, parent)
self.hbox = wx.BoxSizer(wx.HORIZONTAL)
self.vbox = wx.BoxSizer(wx.VERTICAL)
self.listbox = wx.ListBox(self, -1)
self.hbox.Add(self.listbox, 1, wx.EXPAND | wx.ALL, 20)
self.btnPanel = wx.Panel(self, -1)
self.new = wx.Button(self.btnPanel, ID_NEW, 'Nuevo', size=(90, 30))
self.ren = wx.Button(self.btnPanel, ID_RENAME, 'Renombrar', size=(90, 30))
self.dlt = wx.Button(self.btnPanel, ID_DELETE, 'Eliminar', size=(90, 30))
self.edt = wx.Button(self.btnPanel, ID_EDIT, 'Editar', size=(90, 30))
self.sv = wx.Button(self.btnPanel, ID_SAVE, 'Guardar', size=(90, 30))
self.rst = wx.Button(self.btnPanel, ID_RESTORE, 'Restaurar', size=(90, 30))
self.vbox.Add((-1, 20))
self.vbox.Add(self.new)
self.vbox.Add(self.ren, 0, wx.TOP, 5)
self.vbox.Add(self.dlt, 0, wx.TOP, 5)
self.vbox.Add(self.edt, 0, wx.TOP, 5)
self.vbox.Add(self.sv, 0, wx.TOP, 5)
self.vbox.Add(self.rst, 0, wx.TOP, 5)
self.Bind(wx.EVT_BUTTON, self.NewItem, id=ID_NEW)
self.Bind(wx.EVT_BUTTON, self.OnRename, id=ID_RENAME)
self.Bind(wx.EVT_BUTTON, self.OnDelete, id=ID_DELETE)
self.Bind(wx.EVT_BUTTON, self.OnClear, id=ID_EDIT)
self.Bind(wx.EVT_LISTBOX_DCLICK, self.OnRename)
self.Bind(wx.EVT_BUTTON, self.OnSave, id=ID_SAVE)
self.Bind(wx.EVT_BUTTON, self.OnRestore, id=ID_RESTORE)
self.btnPanel.SetSizer(self.vbox)
self.hbox.Add(self.btnPanel, 0.6, wx.EXPAND | wx.RIGHT, 20)
self.SetSizer(self.hbox)
def NewItem(self, event):
text = wx.GetTextFromUser('Nombre', 'Programa a salvar')
if text != '':
self.listbox.Append(text)
def OnRename(self, event):
sel = self.listbox.GetSelection()
text = self.listbox.GetString(sel)
renamed = wx.GetTextFromUser('Nuevo nombre', 'Rename dialog', text)
if renamed != '':
self.listbox.Delete(sel)
self.listbox.Insert(renamed, sel)
def OnDelete(self, event):
sel = self.listbox.GetSelection()
if sel != -1:
self.listbox.Delete(sel)
def OnClear(self, event):
self.listbox.Clear()
def OnSave(self, event):
sel = self.listbox.GetSelection()
if sel != -1:
self.listbox.Delete(sel)
def OnRestore(self, event):
sel = self.listbox.GetSelection()
if sel != -1:
self.listbox.Delete(sel)
#
#
# Frame principal
class Principal(wx.Frame):
def __init__(self,parent,id,title, *args, **kw):
wx.Frame.__init__(self,parent,id,title, size = (800,800))
self.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown)
splitter1 = wx.SplitterWindow(self, -1, style=wx.SP_3D)
splitter2 = wx.SplitterWindow(splitter1, -1, style=wx.SP_3D)
self.lc1 = ListBox(splitter2)
self.lc2 = FileList(splitter1)
self.log = LogText(splitter2, XX)
dt = MyFileDropTarget(self.lc2)
self.lc2.SetDropTarget(dt)
self.Bind(wx.EVT_LIST_BEGIN_DRAG, self.OnSelect, id=self.lc1.GetId())
splitter1.SplitHorizontally(splitter2,self.lc2)
splitter2.SplitVertically(self.lc1, self.log)
splitter1.SetMinimumPaneSize(250)
splitter2.SetMinimumPaneSize(250)
sizer = wx.BoxSizer(wx.HORIZONTAL)
sizer.Add(splitter1, 1, wx.EXPAND)
self.SetSizer(sizer)
splitter1.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown)
splitter2.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown)
self.Centre()
self.Show(True)
def onButton(self, event):
print "You pressed the button!"
def OnKeyDown(self, e):
key = e.GetKeyCode()
if key == wx.WXK_F1:
ret = wx.MessageBox('Are you sure to quit?', 'Question',
wx.YES_NO | wx.NO_DEFAULT, self)
if ret == wx.YES:
self.Close()
def OnSelect(self, event):
list = os.listdir(self.dir.GetPath())
self.lc1.ClearAll()
#self.lc2.ClearAll()
for i in range(len(list)):
if list[i][0] != '.':
self.lc1.InsertStringItem(0, list[i])
if __name__ == "__main__":
app = wx.App()
frame = Principal(None,-1,'Mi aplicacion')
app.MainLoop()
Powered by vBulletin® Version 4.2.5 Copyright © 2025 vBulletin Solutions Inc. All rights reserved.