Προς το περιεχόμενο

Code structuring help


Προτεινόμενες αναρτήσεις

Δημοσ. (επεξεργασμένο)

φτιάχνω μια εφαρμογή σε PYGTK για wine prefix management scanning κτλ. Ουσιαστικά θέλω να ξεφύγει απο αυτοματισμούς με scripts και να έχι πιο πολύ workflow για αυτούς που ξέρουν.

Prefix operations : new , duplicate , scan , del , winetricks, winecfg

Το θέμα μου πως θα οργανώσω τον κώδικα να φτάσω απο window στην εντολή στο σύστημα. Στην πράξη 

WIndow.py

 

	def _new(self, action, param):		
		
		if response == Gtk.ResponseType.OK:
			task=NewPrefix(name,arch)
			self._runner_start(action, task)
			

	def _runner_start(self,action,task):
		worker=Runner(action,self._runner_end,task)
		worker.start()		

runner.py

 

class Runner(Thread):
	
	def __init__(self,action,callback,task):
		Thread.__init__(self)

		self.action=action
		self.callback=callback
		self.task=task
			
	def run(self):
		
		result=self.task.execute()
		GLib.idle_add(self.callback,result,self.action,self.task)
			

 

task.py

class NewPrefix():

	DEFAULT_PATH='~/.wine_prefixes/'
	COMMAND_NEW='WINEPREFIX=%s%s WINEARCH=%s wine wineboot'
	
	def __init__(self, name, arch, path=None):

		self.name=name
		self.arch=arch

	def execute(self):
		
		result=oscommand(self.COMMAND_NEW%(self.DEFAULT_PATH,self.name,self.arch))
		return result

 

Το απο πάνω παίζει . Αλλά δεν μου αρέσει και εχω αλλάξει τον κώδικα πολλές φορές

Λέω μήπως να φτιάξω μια κλάση WinePrefix με μια run() η οποία θα καλεί βάση του actions την αντίστοιχη function ? Δηλαδή 

class WinePrefix(Thread):
	
	def __init__(self,action):
		self.callback=callback
		self.action=action

	def run(self):


		if self.action.get_name()=='new':
			self.new_prefix()	
		
		if self.action.get_name()=='del':
			self.del_prefix()	

		if self.action.get_name()=='cpy':
			self.cpy_prefix()

		GLib.idle_add(self.callback,result,self.action,self.task)
		
	def new_prefix(self):

	def del_prefix(self):

	def cpy_prefix(self):

 

οπότε απλά κάνω call 

 

        if response == Gtk.ResponseType.OK:
            task=WinePrefix(action,self._runner_end,....)
            task.start()

 

Έχετε καμιά ιδέα ? Ίσως πιο pythonic ? Μπορώ να κάνω φυσικά και απευθείας call σε function ... τέσπα επειδή ερχομαι απο java και τα βλέπω όλα κλάσεις ίσως να μην έχω σωστό approach

Και κάποια screenshot

 

 

program.png

program2.png

Επεξ/σία από Aztec
Δημοσ.

Εντάξει έβγαλα άκρη με την ακόλουθη λογική

 

στην window delete operation. 'Εχω φτιάξει εναν runner ο οποίος τους λες την function και την εκτελεί κρατώντας το object initilization
 

    def _delete(self, action, param):

        
        prefix=self.treeview.get_selection()

        if prefix is None:
            return
            
        dialog = DeleteDialog(self,prefix.name)
        response = dialog.run()
        dialog.destroy()
        
        if response == Gtk.ResponseType.OK:

            runner=Runner(action,self._paction_end,prefix,prefix.remove)
            runner.start()

            self._loading()

 

Ουσιαστικά ο runner κρατάει το state του object και το callback και εκτελεί το target οπου έχει περαστεί

Runner.py


 

class Runner(Thread):
    
    def __init__(self, action, callback, prefix, target, args=None):
        Thread.__init__(self)

        self.action=action.get_name()
        self.callback=callback
        self.prefix=prefix
        self.target=target
        self.args=args
        
    def run(self):

        if self.args==None:
            result=self.target()
        else :
            result=self.target(self.args)
            
        GLib.idle_add(self.callback,self.action,result,self.prefix)

 

τέλος η Prefix κλάση έχει όλα τα actions χωρίς να την ενδιαφερει το threading , callback etc

 

 

 

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...