[wxpython] Chiamare la classe Frame più volte

Messaggioda mic_1 » 14/04/2023, 17:19

Ciao a tutti,
Ho creato un visualizzatore dati in wxpython.
Ho chiamato la classe, Frame suddiviso in Panel, per la visualizzazione dei dati del file iniziale (Network Padre).
Vorrei richiamare la stessa classe per il Giant Component.
Se richiamo la classe come "SubFrame().Show()" non funziona perchè, credo, precedentemente chiamata, allo stesso modo e senza problemi.
Non vorrei chiudere il Frame del Network Padre per poter così confrontare i dati con quelli ottenuti dal Giant Component, Network Figlio.

Devo gestirle con la semaforica ?
Come posso risolvere ?
Potete aiutarmi per favore ?
Grazie mille mic
mic_1
Junior Member
Junior Member
 
Messaggio: 191 di 386
Iscritto il: 11/01/2011, 18:11

Re: [wxpython] Chiamare la classe Frame più volte

Messaggioda mic_1 » 17/04/2023, 17:37

NB: Alla pressione di un tasto calcolo i componenti connessi e alla selezione di un qualsiasi componente dovrebbe partire la funzione "Subframe().Show()" con i parametri assegnati.
Purtroppo non parte...

Ho importato la funzione così:
Codice:
import SubFrame
from SubFrame import *


Secondo voi perchè la funzione non parte?
Grazie
mic_1
Junior Member
Junior Member
 
Messaggio: 192 di 386
Iscritto il: 11/01/2011, 18:11

Re: [wxpython] Chiamare la classe Frame più volte

Messaggioda apatriarca » 18/04/2023, 10:37

Direi che senza vedere meglio il codice non è possibile dire nulla..
apatriarca
Moderatore
Moderatore
 
Messaggio: 5724 di 10436
Iscritto il: 08/12/2008, 20:37
Località: Madrid

Re: [wxpython] Chiamare la classe Frame più volte

Messaggioda mic_1 » 26/04/2023, 16:46

Ciao apatriarca, quale porzione di codice è necessario inserisca qui ?
Di entrambe le chiamate oppure solo quella non funzionante?
Grazie
mic_1
Junior Member
Junior Member
 
Messaggio: 193 di 386
Iscritto il: 11/01/2011, 18:11

Re: [wxpython] Chiamare la classe Frame più volte

Messaggioda mic_1 » 26/04/2023, 16:57

Nel primo caso chiamo la classe in questo modo passando i parametri
Codice:
SubFrame(M, G, False).Show()

Mentre nel secondo, per il figlio,
Codice:
SubFrame(None, G_sub, True).Show()

M = network multigraph
G= network graph
G_sub = network giant component
mic_1
Junior Member
Junior Member
 
Messaggio: 194 di 386
Iscritto il: 11/01/2011, 18:11

Re: [wxpython] Chiamare la classe Frame più volte

Messaggioda mic_1 » 09/05/2023, 21:18

Codice:
import wx
import networkx as nx
import pandas as pd
import SubFrame
from SubFrame import *

import os, sys
# richiamo il percorso della cartella
sys.path.append(os.path.dirname(os.path.realpath(__file__)))

'''
Questa classe viene lanciata alla pressione di un pulsante presente nella schermata del Frame padre
(pulsante disabilitato se il numero dei componenti connessi è =1)
Viene creata la finestra con l'elenco dei componenti connessi e, selezionato il componente e premuto il tasto Extract dovrebbe partire l'elaborazione del SubFrame per il componente selezionato.
'''                       
class ListBoxFrame(wx.Frame):
    def __init__(self, graphgraph, n, data):
        try:           
            wx.Frame.__init__(self, None, -1, "Connected Components", size=(410, 280), style=wx.DEFAULT_DIALOG_STYLE)

            panel = wx.Panel(self, -1)
            self.Gr = graphgraph   
            self.n_col = n
            self.data = data
            self.Press = bool()
            text = wx.StaticText(panel, -1, "Extract Connected Components of Network", wx.Point(20, 20))
            text.SetFont(wx.Font(9, wx.MODERN, wx.ITALIC, wx.BOLD))             
            hbox = wx.BoxSizer(wx.HORIZONTAL)           
            i=1; List=[]

            self.CompC = [len(subnodes) for subnodes in sorted(nx.connected_components(self.Gr), key=len, reverse=True)]                                   

            for component in self.CompC :
                List.append('Component '+str(i)+' ('+str(component)+')') ; i+=1             
            self.listBox = wx.ListBox(panel, -1, wx.Point(20, 20), wx.Size(300, 250), List, wx.LB_SINGLE)
            hbox.Add(self.listBox, 1, wx.EXPAND | wx.ALL, 50)
            btnpanel = wx.Panel(panel, -1)
            vbox = wx.BoxSizer(wx.VERTICAL)
            self.Extr = wx.Button(btnpanel, -1, label='Extract', size=(90, 30))
            self.Bind(wx.EVT_BUTTON, self.Extract, self.Extr)
            vbox = wx.BoxSizer(wx.VERTICAL)
            vbox.Add((-1, 50))
            vbox.Add(self.Extr)
            btnpanel.SetSizer(vbox)
            hbox.Add(btnpanel, 0.6, wx.EXPAND | wx.RIGHT, 20)
            panel.SetSizer(hbox)
            self.Centre()
            self.Show()
        except:
            wx.MessageDialog(self, "ERROR", "Error ListBoxFrame", wx.OK|wx.ICON_ERROR)

    def Extract(self, event):     
        try:
            sel = self.listBox.GetSelection()  #val = self.listBox.GetString(sel)                                               
            # Componenti Connessi
            component = self.CompC           
            for subnodes in sorted(nx.connected_components(self.Gr), key=len, reverse=True) :
                if len(subnodes) == component[sel] :        node = subnodes ; self.Press = True
                else:                                                        continue                                   
            # Creazione SubGraphs
            G_sub = nx.subgraph(self.Gr, node)           

            # Creo il dataframe delle interazioni del SubGraph e lo ricerco nel dataframe del MutiGraph
            # in modo da poter risalire alle informazioni che mi interessano
            data = dict(nx.get_edge_attributes(G_sub ,'label')).items()             
            df_data = pd.DataFrame( dict(data).keys() , columns=[0, 2])                           
            df_data.insert(1, 1, dict(data).values())                                               
            df_netw_G_sub = (df_data[0].map(str) + "(" + df_data[1]).map(str) + ")" + df_data[2] 
            netw_G_sub = df_netw_G_sub.tolist()                 
            df = self.data 

            # catturo righe info da MG a GiantComp
            df_info_G_sub = df.loc[ ((df[0].isin(df_data[0])) & (df[1].isin(df_data[1].unique())) & (df[2].isin(df_data[2]))) | ((df[0].isin(df_data[2])) & (df[1].isin(df_data[1].unique())) & (df[2].isin(df_data[0]))) ]                   
            info_df_G_sub=[]
            for i in range(self.n_col):     info_df_G_sub.append(df_info_G_sub[i].tolist()) 
            IDTypeEdges_G_sub = df_info_G_sub[1].nunique()         # number of interaction types                 
            typeEDGES_G_sub = df_info_G_sub[1].value_counts()      # number edges for each interaction type                                         

            '''
            Richiamo nuovamente Il SubFrame che ripercorre il ciclo per il componente connesso selezionato i parametri sono : 1 - Multigraph; 2 - Graph/SubGraph; 3 - Pressione del tasto (variabile booleana) (tasto presente nella schermata Frame Padre: false per il padre e true per i figli/componenti)
            '''
            SubFrame( None, G_sub, self.Press).Show(True)   
        except:
            wx.MessageDialog(self, "ERROR", "Error ListBoxFrame", wx.OK|wx.ICON_ERROR)


Il SubFrame().Show() parte la prima volta per il Network principale ma NON per il componente connesso selezionato. Mi è stato consigliato di mettere il percorso della classe perchè si comportava come se non venisse trovata ( ho provato ad importare la classe come : from ..Cartella import SubFrame ma in fase di compilazione ho errore. Ho inserito il percorso nel modo sopra indicato ma non succede nulla)

Cosa sbaglio???? Spero possiate aiutarmi
Grazie
mic_1
Junior Member
Junior Member
 
Messaggio: 195 di 386
Iscritto il: 11/01/2011, 18:11

Re: [wxpython] Chiamare la classe Frame più volte

Messaggioda mic_1 » 11/05/2023, 12:05

Vi riporto la classe che viene richiamata più volte :
- la prima volta viene riconosciuta e mi valorizza tutti i parametri correttamente
- la seconda volta no
Che non riconosca il "None" ?
Ci sono errori nei parametri ?
Grazie
Codice:
class SubFrame(wx.Frame):       
    def __init__(self, M, G, isPressed):
        self.M_G = M
        self.Gr = G                 
        self.isPressed = isPressed                                               
        print("preso sub")       
        size_x, size_y = None, None  # reset per chiamata GiantComp       
        size_x, size_y = wx.GetDisplaySize()               
        if self.isPressed == False:    pass
        else:                          self.num_max_Gsub = GiantComp       

        # carica una volta sola tutte le informazioni che poi userò in seguito       
        UPLOAD(self.M_G, self.Gr, self.isPressed)   

        # TAB 0 SUDDIVISO IN SEZIONi sezione up: VP_UP, sezione down: (VP_DX, VP_CX, VP_SX )
        super(SubFrame, self).__init__(None, title ="Network Analysis", style=wx.DEFAULT_FRAME_STYLE, size=(size_x, size_y))   
mic_1
Junior Member
Junior Member
 
Messaggio: 196 di 386
Iscritto il: 11/01/2011, 18:11


Torna a Informatica

Chi c’è in linea

Visitano il forum: C0SIM0 e 1 ospite