Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 26/01/2017, à 10:52

WormZoom

[RESOLU] [Python3/GTK]- Probleme de concatenation

Il me faut faire une "concatenation" en vue de remplir un Treeview formaté ainsi :

   

Gtk.ListStore(int, str, str, str, int, int)

Grace à :

   

self.listmodel.append(vv)

Le résultat de la concaténation doit donc etre formé ainsi car c'est ce qu'attend le ListStore (int, str, str, str, int, int)

   

[1, "DASH audio", "249 - audio only (DASH audio)", "webm", 1.21, 249]

Pour constuire ma concaténation de la variable vv , je procéde ainsi :

   

vv = "["+str(compteur)+", \""+YD_formats['format_note']+"\", \""+YD_formats['format']+"\", \""+YD_formats['ext']+"\", "+str(T1)+", "+YD_formats['format_id']+"]"

Pour info ma variable compteur est :
   

compteur = 1

Pour info ma variable T1 est ainsi :

   

LC_taille = YD_formats['filesize']

   

T1 = round(((LC_taille/1024)/1024),2)

Quand je fais le retour du listmodel.append avec la variable vv     
   

self.listmodel.append(vv)

j'ai le droit à un Type Error :

Traceback (most recent call last):
  File "/home/server/Bureau/Python/nul.py", line 237, in SearchYoutube
    self.listmodel.append(vv)
  File "/usr/lib/python3/dist-packages/gi/overrides/Gtk.py", line 956, in append
    return self._do_insert(-1, row)
  File "/usr/lib/python3/dist-packages/gi/overrides/Gtk.py", line 947, in _do_insert
    row, columns = self._convert_row(row)
  File "/usr/lib/python3/dist-packages/gi/overrides/Gtk.py", line 845, in _convert_row
    raise TypeError('Expected a list or tuple, but got str')
TypeError: Expected a list or tuple, but got str

Pourtant, la ou je suis perdu c'est que :

Si je fais un print dans la console de ma variable vv, j'obtiens le résultat ci dessous qui est adéquate :
   
   

[1, "DASH audio", "249 - audio only (DASH audio)", "webm", 1.21, 249]

Quand j'insert directement (comme ci dessous)  dans le listmodel.append, la encore j'obtiens le résultat adéquate (la ligne s'ajoute bien dans le  Treeview).

   

self.listmodel.append([1, "DASH audio", "249 - audio only (DASH audio)", "webm", 1.21, 249])

Il y a donc , je suppose, quelque chose qui ne va pas dans ma concatenation de ma variable vv
                                                                                                                   
   

vv = "["+str(compteur)+", \""+YD_formats['format_note']+"\", \""+YD_formats['format']+"\", \""+YD_formats['ext']+"\", "+str(T1)+", "+YD_formats['format_id']+"]"

Le TypeError mentionne qu'il attend une list ou un tuple, mais qu'il recoit un str ... cependant il me semble bien avoir construit une liste !!!

Je ne comprends pas du tout ou je fais erreur... Si quelqu'un peut m'eclaircir ... ou encore directement me corrigé, je pourrais comprendre ou je fais erreur..


Merci.

Dernière modification par WormZoom (Le 26/01/2017, à 20:14)

Hors ligne

#2 Le 26/01/2017, à 11:41

pingouinux

Re : [RESOLU] [Python3/GTK]- Probleme de concatenation

Bonjour,

    self.listmodel.append(vv)
.....
    raise TypeError('Expected a list or tuple, but got str')
vv = "["+str(compteur)+", \""+YD_formats['format_note']+"\", \""+YD_formats['format']+"\", \""+YD_formats['ext']+"\", "+str(T1)+", "+YD_formats['format_id']+"]"

vv, tel que défini ici, est une chaîne, et apparemment ça ne convient pas à listmodel.

Ajouté : Autre truc bizarre, qui n'est pas la cause de l'erreur

Gtk.ListStore(int, str, str, str, int, int)
.....
[1, "DASH audio", "249 - audio only (DASH audio)", "webm", 1.21, 249]

L'avant-dernier terme de la liste n'est pas un int.

Dernière modification par pingouinux (Le 26/01/2017, à 12:16)

Hors ligne

#3 Le 26/01/2017, à 12:49

WormZoom

Re : [RESOLU] [Python3/GTK]- Probleme de concatenation

Hello,

En effet pour l'avant dernier int je le savais, mais cela ne pose pas de probleme en soit a gtk car quand il me l'ajoute dans le treeview il me le laisse dans ce format, si je lui dit que c'est pas un int, mais un float, dans le treeview, il m'ajoute plein de 0 apres.
Mais en effet le probleme ne vient pas de la.

Je viens de me rendre compte qu'a force de faire des test dans tous les sens j'ai oublié d'ajouter les ()

vv = "[("+str(compteur)+", \""+YD_formats['format_note']+"\", \""+YD_formats['format']+"\", \""+YD_formats['ext']+"\", "+str(T1)+", "+YD_formats['format_id']+")]"

Mais de toute façon cela ne change rien au résultat avec ou sans, j'ai toujours la même erreur, de plus, en faisant comme ci dessous sans les parenthèses, le append se fait correctement.

self.listmodel.append([1, "DASH audio", "249 - audio only (DASH audio)", "webm", 1.21, 249])

De plus afin d’éliminer ou du moins d'affiner le plus possible afin de trouver mon erreur je ne fais le test finalement que sur "une ligne" de la liste vv.

J'avais au début de mon code, fais comme indiqué dans l'un des fichiers d'exemple fourni avec GTK
ma variable vv etait construite dans le meme principe que  celle de  software_list, avec bien evidement la boule for ...

Mais cela ne fonctionne pas , j'ai toujours eu la meme erreur de tuple/list ..

raise TypeError('Expected a list or tuple, but got str')
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk

#list of tuples for each software, containing the software name, initial release, and main programming languages used
software_list = [("Firefox", 2002,  "C++"),
                 ("Eclipse", 2004, "Java" ),
                 ("Pitivi", 2004, "Python"),
                 ("Netbeans", 1996, "Java"),
                 ("Chrome", 2008, "C++"),
                 ("Filezilla", 2001, "C++"),
                 ("Bazaar", 2005, "Python"),
                 ("Git", 2005, "C"),
                 ("Linux Kernel", 1991, "C"),
                 ("GCC", 1987, "C"),
                 ("Frostwire", 1, "Java")]

class TreeViewFilterWindow(Gtk.Window):

    def __init__(self):
        Gtk.Window.__init__(self, title="Treeview Filter Demo")
        self.set_border_width(10)

        #Setting up the self.grid in which the elements are to be positionned
        self.grid = Gtk.Grid()
        self.grid.set_column_homogeneous(True)
        self.grid.set_row_homogeneous(True)
        self.add(self.grid)

        #Creating the ListStore model
        self.software_liststore = Gtk.ListStore(str, int, str)
        for software_ref in software_list:
            self.software_liststore.append(list(software_ref))
        self.current_filter_language = None

        #Creating the filter, feeding it with the liststore model
        self.language_filter = self.software_liststore.filter_new()
        #setting the filter function, note that we're not using the
        self.language_filter.set_visible_func(self.language_filter_func)

        #creating the treeview, making it use the filter as a model, and adding the columns
        self.treeview = Gtk.TreeView.new_with_model(self.language_filter)
        for i, column_title in enumerate(["Software", "Release Year", "Programming Language"]):
            renderer = Gtk.CellRendererText()
            column = Gtk.TreeViewColumn(column_title, renderer, text=i)
            self.treeview.append_column(column)

        #creating buttons to filter by programming language, and setting up their events
        self.buttons = list()
        for prog_language in ["Java", "C", "C++", "Python", "None", "Del"]:
            button = Gtk.Button(prog_language)
            self.buttons.append(button)
            button.connect("clicked", self.on_selection_button_clicked)

        #setting up the layout, putting the treeview in a scrollwindow, and the buttons in a row
        self.scrollable_treelist = Gtk.ScrolledWindow()
        self.scrollable_treelist.set_vexpand(True)
        self.grid.attach(self.scrollable_treelist, 0, 0, 8, 10)
        self.grid.attach_next_to(self.buttons[0], self.scrollable_treelist, Gtk.PositionType.BOTTOM, 1, 1)
        for i, button in enumerate(self.buttons[1:]):
            self.grid.attach_next_to(button, self.buttons[i], Gtk.PositionType.RIGHT, 1, 1)
        self.scrollable_treelist.add(self.treeview)

        self.show_all()

    def language_filter_func(self, model, iter, data):
        """Tests if the language in the row is the one in the filter"""
        if self.current_filter_language is None or self.current_filter_language == "None":
            return True
        else:
            return model[iter][2] == self.current_filter_language

    def on_selection_button_clicked(self, widget):
        """Called on any of the button clicks"""
        #we set the current language filter to the button's label
        self.current_filter_language = widget.get_label()
        if "%s" != "Del":
            print("%s language selected!" % self.current_filter_language)
            #we update the filter, which updates in turn the view
            self.language_filter.refilter()
        else:
            liststore.clear()

win = TreeViewFilterWindow()
win.connect("delete-event", Gtk.main_quit)
win.show_all()
Gtk.main()

Dernière modification par WormZoom (Le 26/01/2017, à 12:52)

Hors ligne

#4 Le 26/01/2017, à 17:34

pingouinux

Re : [RESOLU] [Python3/GTK]- Probleme de concatenation

Essaye en définissant vv ainsi :

vv = [str(compteur), YD_formats['format_note'], YD_formats['format'], YD_formats['ext'], str(T1), YD_formats['format_id']]

Il faudra peut-être ajouter des conversions de type sur certains éléments.

Dernière modification par pingouinux (Le 26/01/2017, à 17:35)

Hors ligne

#5 Le 26/01/2017, à 20:13

WormZoom

Re : [RESOLU] [Python3/GTK]- Probleme de concatenation

Merci ça marche !

Je m’étais refusé cette voie car j’étais têtu ... sur le fait d'avoir des fichues " " sur le éléments de types textes..

Hors ligne