#1 Le 26/01/2017, à 09: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, à 19:14)
Hors ligne
#2 Le 26/01/2017, à 10: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, à 11:16)
Hors ligne
#3 Le 26/01/2017, à 11: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, à 11:52)
Hors ligne
#4 Le 26/01/2017, à 16: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, à 16:35)
Hors ligne
#5 Le 26/01/2017, à 19: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