Forum >> Programmazione Python >> GUI >> Finestre nidificate tkinter

Pagina: 1

Salve, premetto che sono decisamente nuovo della programmazione Python e, specialmente, a lavorare con le gui.
Vorrei capire come realizzare una cosa che è certamente banale, ma che proprio non mi riesce:




Io ho realizzato una finestra con un menu a cascata. All'interno del menù ho le varie voci. A questo punto vorrei che, cliccando su queste voci, mi venisse caricato un file .py non però in una nuova finestra, ma all''interno della stessa. Così ogni volta che si seleziona una voce del menù, viene eseguito il file corrispondente.




Spero di essermi spiegato bene e che qualcuno possa aiutarmi.
Per poterti aiutare sarebbe il caso tu postassi un po di codice da te scritto.
Gentilmente nel farlo utilizza il simbolo :
Grazie.
Hai ragione, allora, ti mostro il codice:

from tkinter import *
from tkinter import ttk
from PIL import Image, ImageTk
 
class CreaMenu(Frame):
  
    def __init__(self, parent):
        ttk.Frame.__init__(self, parent, relief=FLAT, borderwidth=0)   
         
        self.parent = parent        
        self.initUI()
         
        
    def initUI(self):
      
        menubar = Menu(self.parent)
        self.parent.config(menu=menubar)
        
        fileMenu = Menu(menubar, tearoff=0)
        
        fileMenu.add_command(label="Calcolo 1"  )
        fileMenu.add_command(label="Calcolo 2"  )
        menubar.add_cascade(label="Generale", menu=fileMenu) 
   
# Programma Principale
def main():
    root = Tk()
    root.geometry("650x550+300+300")                                       
    root.title("Finestra principale")                             
    appBase = CreaMenu(root)                        
    root.mainloop()                                    

main() 


La finestra mi viene creata regolarmente e ho il meù in alto con la voce "Generale". Se clicco su di essa mi si apre la cascata con "Calcolo 1" e "Calcolo 2".

A questo punto, i due calcoli li ho su due fil che si chiamano calcolo1.py e calcolo2.py.

Io vorrei che cliccando su "Calcolo 1" del menù venisse eseguito il codice del file calcolo1.py, ovviamente, però, non voglio che venga creata una nuova finestra, ma il codice venga eseguito dentro la finestra principale. Nella stessa maniera se clicco su "Calcolo 2", mi deve venire eseguito il codice di calcolo2.py all'interno della finestra principale (rimuovendo, se ci sono, altre cose presenti).

--- Ultima modifica di dany in data 2016-03-07 09:56:36 ---
Da questo:
però, non voglio che venga creata una nuova finestra,
sembra che i file calcolo1.py e calcolo2.py abbiano a che fare in qualche modo con una GUI creata separatamente magari all'interno dei file stessi.
Se cosi fosse dovremmo vedere anche il codice scritto nei due file sopra citati in modo tale da poter capire come integrare la gui cretata nei file a quella postata.
Comunque per farti capire come procedere ipotiziamo che i due file eseguano esclusivamente calcoli matematici o su stringhe e il risultato di tali calcoli vengano stampati nella consol di python.
Prima cosa bisogna importare i due file come se fossero dei moduli con:
import calcolo1,calcolo2
dopo di che devi allacciare la parte di menu interessata a un segnale/evento esempio:
		fileMenu.add_command(label="Calcolo 1", command = self.stampaCalcolo1)
		fileMenu.add_command(label="Calcolo 2"  )
		menubar.add_cascade(label="Generale", menu=fileMenu)
	#----------------------------------------------------------------------
	def stampaCalcolo1(self):
		"""qui richiamerai la o le funzioni del file calcolo1"""
		print ('ecco fatto')
Attenzione però che è arrivato il momento di dare un'occhiata a: MVC https://it.wikipedia.org/wiki/Model-View-Controller


--- Ultima modifica di Orsogrizzly in data 2016-03-07 11:04:35 ---
L'idea era quella di creare delle GUI per ciascun file e poi richiarmarle a seconda delle necessità affinchè ognuna svolgesse le proprie funzioni.
Perchè, da come mi hai indicato, io devo fare l'importazione dei moduli e poi, dallo script che genera della gui utilizzare le funzioni di ciascun file a seconda della necessità.




Ma poniamo che io abbia un numero n di file, dovrei fare "import calcolo1, calcolo2, ..., calcolon" e poi dovrei avere n funzioni nella finestra principale.

Il risultato potrebbe essere, ipoteticamente, un'importazione di 100 file ed un file "mainwindow.py" (che è quello con la gui) magari di 20 Mb.




Non è possibile avere dei file, ciascuno che fa le cose che è deputato a fare, ciascuno con la propria gui e, semplicemente, avere una gui comune all'intero della quale caricare le altre solo quando servono?

Per chiarire, un po' come fare una chiamata asincrona di javascript, o, più banale ancora, un iframe di HTML dove, a seconda di dove clicco, dentro il frame viene caricato il contenuto di un file, piuttosto di un altro.
Piccolo esempio per darti un idea:
salva questo come provaPrincipale.py
from tkinter import *
from provaPrincipaleSecondaria import *

class Principale(Frame):
#----------------------------------------------------------------------
	def __init__(self, master = None):
		"""Constructor"""
		Frame.__init__(self, master)
		self.master.title("Principale")
		self.master.geometry("650x550+300+300")
		#self.configure(geometry = "650x550+300+300")
		self.winfo_toplevel()
		self.bottone = Button(text = 'INVIA', command = self.stampa)
		self.bottone.pack()
		self.bottone1 = Button(text = 'CHIUDI', command = self.chiudi)
		self.bottone1.pack()
		self.seconda = Secondaria
	#----------------------------------------------------------------------
	def stampa(self):
		""""""
		self.seconda()
	#----------------------------------------------------------------------
	def chiudi(self):
		""""""
		self.quit()

if __name__ == '__main__':
	
	main = Principale()
	main.mainloop()
e questo come: provaPrincipaleSecondaria.py
from tkinter import * 

########################################################################
class Secondaria(Toplevel):
	""""""

	#----------------------------------------------------------------------
	def __init__(self):
		"""Constructor"""
		Toplevel.__init__(self)
		self.title("Secondatia")
		self.geometry("400x400+300+300")
		self.bottone = Button(self, text = 'stampa', command = self.stampa)
		self.bottone.pack()
		self.bottoneChiudi = Button(self, text = 'Chiudi seconda', command = self.chiudiSeconda)
		self.bottoneChiudi.pack()
	#----------------------------------------------------------------------
	def stampa(self):
		""""""
		print('prova')
	#----------------------------------------------------------------------
	def chiudiSeconda(self):
		""""""
		self.destroy()
entrambi sulla stessa cartella e avvia il primo.

e un link per un altra metodologia : https://www.youtube.com/watch?v=jBUpjijYtCk&index=4&list=PLQVvvaa0QuDclKx-QpC9wntnURXVJqLyk


--- Ultima modifica di Orsogrizzly in data 2016-03-09 21:45:27 ---


Pagina: 1



Esegui il login per scrivere una risposta.