[Python,Kivy] impossible d utiliser .add_widget
Répondre à la discussion
Affichage des résultats 1 à 15 sur 15

[Python,Kivy] impossible d utiliser .add_widget



  1. #1
    Dragon999

    [Python,Kivy] impossible d utiliser .add_widget


    ------

    Bonjour a toutes et a tous.

    Je me retrouve dans une position que je n'arrive pas à résoudre et ce n'est pas faute de chercher.


    Un ami m'a filé une formation python que je suis, mais je me retrouve devant un problème. Pendant le cours des layout kivy le formateur place du code dans le fichier python pour automatiser la création de bouton. Tout semble marcher chez lui, mais chez moi pas du tout. J'ai beau chercher sur le net, je ne trouve personne avec mon problème...


    Le problème semble venir de l'utilisation d'un fichier .kv externe en plus d'un appel a la metode .add_widget() . En effet, quand je lance des morceaux de code trouver sur Internet n'utilisant pas de fichier .kv tout marche à merveille

    mon code python
    main.py
    Code:
    from kivy.app import App
    from kivy.uix.anchorlayout import AnchorLayout
    from kivy.uix.boxlayout import BoxLayout
    from kivy.uix.button import Button
    from kivy.uix.gridlayout import GridLayout
    from kivy.uix.stacklayout import StackLayout
    from kivy.uix.widget import Widget
    
    class MainWidget(Widget): #Un widget est un controle que l on affiche a l'ecran
        pass
    class BoxLayoutExemple(BoxLayout):
        pass
        '''def __int__(self, **kwargs):#**kwargs kivy a bosoin de passer des argument pour fonctionner !!!!!!!
            super().__init__(**kwargs)
            b1 = Button(text='A')# la syntax est differente (: / =) car le bouton est coder dans le fichier python
            b2 = Button(text='B')
            self.add_widget(b1)
            self.add_widget(b2)'''
    class AnchorLayoutExemple(AnchorLayout):
        pass
    #class GridLayoutExemple2(GridLayout): #Specifié dans le fichier kv mais empeche d ecrire du code ici
    #   pass
    
    class StackLayoutExemple(StackLayout):
        def __int__(self,**kwargs):
                super().__int__(**kwargs)
                b = Button(texte="Z")
                self.add_widget(b)
    
    
    class LeLabApp(App):
        pass
    
    
    
    
    LeLabApp().run()
    le fichier kv
    lelab.kv
    Code:
    #Widget contenu dynamique
    #BoxLayoutExemple Stack les element sur une seul ligne et defini la taille pour prendre toute la place
    #AnchorLayout stack un element par raport a la fenetre
    #GridLayout placer plusieur element par ligne et par colones
    #StackLayout Stack les element d un taille defini et passe a la ligne
    
    StackLayoutExemple:
    
    
    <MainWidget>:
        Button:
            text:"Hello"
            size:"100dp",'60dp'# 40dp~largeure d un doigt
            pos:'200dp','100dp'
        Label:
            text:"Hello2"
            size:"100dp",'60dp'
            pos:'200dp','160dp'
            color:1,1,0.4,1 #  R,V,B,A
    
    
    <BoxLayoutExemple>:
        orientation:'horizontal'
        Button:
            text:'A'
            #size_hint:None, None # l on indique que l on vas utiliser une taille fix
            # size:"100dp",'60dp'#et on defini la taille fix
            size_hint:0.5, None # w 100%,None l on indique que l on vas utiliser une taille special
            height: '60dp'
            pos_hint: { "center_y" : 0.5  } #pren un parametre par coordoné poin de ref en bas a gauche
                            #x, right, center_x / y, top, center_y
    
        BoxLayout:
            orientation:'vertical'
            spacing: '10dp'#Equivalen du padding??? en css
            Button:
                text:'B1'
            Button:
                text:'B2'
            Button:
                text:'B3'
            Button:
                text:'B4'
        Button:
            text:'B'
            size:"100dp",'60dp'#ignoré le layout deffini la taille
            size_hint:1, 2 #100%, 200% Propiété de taille utiliser dans les layout *_hint utiliser en %(float)
        Button:
            text:'c'
    
    
    <GridLayoutExemple@GridLayout>:
            #Propiété obligatoire
            #   row   --lignes
            #   cols  --colones
        cols:3
        Button:
            text:'A'
            size_hint: None , 1#!!!!!! Passer ces parametre dans le button D qui est dans la meme colonne
            width: '60dp'
    
        BoxLayoutExemple:#on apelle un BoxLayout costruit plus haut
        Button:
            text:'C'
    
        Button:
            text:'D'
            size_hint: None , 1#!!!!!! Passer ces parametre dans le button A qui est dans la meme colonne
            width: '60dp'
        Button:
            text:'E'
    
    <StackLayoutExemple>:
        Button:
            text: 'A'
            size_hint:0.2,0.2
        Button:
            text: 'B'
            size_hint:0.2,0.2

    -----

  2. #2
    Dragon999

    Re : [Python,Kivy] impossible d utiliser .add_widget

    class StackLayoutExemple(StackLayout ):
    def __int__(self,**kwargs):
    super().__int__(**kwargs)
    b = Button(text="Z") #j ai corrigé texte --> text mais rien n y change
    self.add_widget(b)

  3. #3
    bisou10

    Re : [Python,Kivy] impossible d utiliser .add_widget

    Comment as tu installé Kivy ? avec pip3 ?
    Quelle version ?
    Es tu sur Windows, Linux ?
    J'ai eu des soucis avec Kivy sur certaines fonctions entre Windows et Linux selon la version.

  4. #4
    Dragon999

    Thumbs down Re : [Python,Kivy] impossible d utiliser .add_widget

    J'avais installer kivy via le terminal linux (je suis sous kubuntu) mais j ai désinstaller car je n arrivais pas a le faire fonctionner
    Je l ai désinstaller puis réinstaller dans un venv via le terminal pycharm directement depuis le dossier du projet

    j ai Kivy 2.1.0
    pip 21.3.1 from /home/dragon/PycharmProjects/Kivy_leLab/venv/lib/python3.9/site-packages/pip (python 3.9)

    J ai reussi a trouver un fausse solution mais je ne comprend pas qu'est ce qui foire dans mon code,je m explique:

    -J ai pris un bout de code trouver sur le net qui add un bouton depuis le code python sans kivi
    -Je l ai modifier pour rajouter un fichier .kv vide en vérifiant que add marchais toujours
    -Puis j ai ajouter peu a peu des morceau de code de mon code (celui au dessus)
    -Puis empiriquement j ai rajouter le code qui ne marchais pas dans cette version alternative qui marche

    - j ai ensuitre crée un sous dossier -marchepas et renomer mes fichier et mes class pour continuer la formation (vu que la ca marchais)
    voila le nouveau fichier
    main.py
    Code:
    from kivy.app import App
    from kivy.metrics import dp
    from kivy.uix.anchorlayout import AnchorLayout
    from kivy.uix.boxlayout import BoxLayout
    from kivy.uix.gridlayout import GridLayout
    from kivy.uix.label import Label
    from kivy.uix.textinput import TextInput
    from kivy.uix.stacklayout import StackLayout
    from kivy.uix.button import Button
    from kivy.uix.widget import Widget
    
    
    class MainWidget(Widget): #Un widget est un controle que l on affiche a l'ecran
        pass
    
    class BoxLayoutExemple(BoxLayout):
        def __init__(self, **kwargs):
            super().__init__(**kwargs)
    
            b1 = Button(text='AAA')  # la syntax est differente (: / =) car le bouton est coder dans le fichier python
            b2 = Button(text='BBB')
            self.add_widget(b1)
            self.add_widget(b2)
    
    
    class AnchorLayoutExemple(AnchorLayout):
        pass
    class StackLayoutExemple(StackLayout):
    
        def __init__(self, **kwargs):
            super().__init__(**kwargs)
            for i in range(0,100):
                b = Button(text=str(i+1),size_hint=(None,None), size=(dp(60),dp(60) ))
                self.add_widget(b)
    
    
    
    class LeLab(App):
    
        pass
    
    LeLab().run()

    lelab.kv (new)
    Code:
    StackLayoutExemple:
    
    <MainWidget>:
        Button:
            text:"Hello"
            size:"100dp",'60dp'# 40dp~largeure d un doigt
            pos:'200dp','100dp'
        Label:
            text:"Hello2"
            size:"100dp",'60dp'
            pos:'200dp','160dp'
            color:1,1,0.4,1 #  R,V,B,A
    
    <BoxLayoutExemple>:
        orientation:'horizontal'
        Button:
            text:'A'
            #size_hint:None, None # l on indique que l on vas utiliser une taille fix
            # size:"100dp",'60dp'#et on defini la taille fix
            size_hint:0.5, None # w 100%,None l on indique que l on vas utiliser une taille special
            height: '20dp'
            pos_hint: { "center_y" : 0.5  } #pren un parametre par coordoné poin de ref en bas a gauche
                            #x, right, center_x / y, top, center_y
        BoxLayout:
            orientation:'vertical'
            spacing: '10dp'#Equivalen du padding??? en css
            Button:
                text:'B1'
            Button:
                text:'B2'
            Button:
                text:'B3'
            Button:
                text:'B4'
        Button:
            text:'B'
            size:"100dp",'60dp'#ignoré le layout deffini la taille
            size_hint:1, 2 #100%, 200% Propiété de taille utiliser dans les layout *_hint utiliser en %(float)
        Button:
            text:'c'
    
    
    <GridLayoutExemple@GridLayout>:
            #Propiété obligatoire
            #   row   --lignes
            #   cols  --colones
        cols:3
        Button:
            text:'A'
            size_hint: None , 1#!!!!!! Passer ces parametre dans le button D qui est dans la meme colonne
            width: '60dp'
    
        BoxLayoutExemple:#on apelle un BoxLayout costruit plus haut
        Button:
            text:'C'
    
        Button:
            text:'D'
            size_hint: None , 1#!!!!!! Passer ces parametre dans le button A qui est dans la meme colonne
            width: '60dp'
        Button:
            text:'E'
    
    <StackLayoutExemple>:
        Button:
            text: 'A'
            size_hint:0.2,0.2
        Button:
            text: 'B'
            size_hint:0.2,0.2

    Le problème c est que je ne comprend pas ce qui empêchais le code de marcher précédemment alors que avec du quasi copier coller, la, ça marche????
    Dernière modification par Dragon999 ; 17/04/2022 à 19h33.

  5. A voir en vidéo sur Futura
  6. #5
    Dragon999

    Re : [Python,Kivy] impossible d utiliser .add_widget

    par ailleurs quand je copie colle le contenu du premier fichier kv dans le nouveau le code fonctionne.
    le problème dois venir du fichier main.py

  7. #6
    umfred

    Re : [Python,Kivy] impossible d utiliser .add_widget

    et si tu nous mettais le message d'erreur complet au moins ? il doit y avoir plein d'info dedans.

  8. #7
    Dragon999

    Re : [Python,Kivy] impossible d utiliser .add_widget

    Le truc c est qu in n y a pas de message d'erreur le programme s’exécute sans problème mais il ignore les méthodes getwidget() (code de mon premier message)

    voici ce qui s afficche:
    /home/dragon/PycharmProjects/Kivy_leLab/venv/bin/python /home/dragon/PycharmProjects/Kivy_leLab/main.py
    [INFO ] [Logger ] Record log in /home/dragon/.kivy/logs/kivy_22-04-19_1.txt
    [INFO ] [Kivy ] v2.1.0
    [INFO ] [Kivy ] Installed at "/home/dragon/.local/lib/python3.9/site-packages/kivy/__init__.py"
    [INFO ] [Python ] v3.9.7 (default, Sep 10 2021, 14:59:43)
    [GCC 11.2.0]
    [INFO ] [Python ] Interpreter at "/home/dragon/PycharmProjects/Kivy_leLab/venv/bin/python"
    [INFO ] [Logger ] Purge log fired. Processing...
    [INFO ] [Logger ] Purge finished!
    [INFO ] [Factory ] 189 symbols loaded
    [INFO ] [ImageLoaderFFPy] Using ffpyplayer 4.3.5
    [INFO ] [Image ] Providers: img_tex, img_dds, img_sdl2, img_pil, img_ffpyplayer
    [INFO ] [Text ] Provider: sdl2
    [INFO ] [Window ] Provider: sdl2
    [INFO ] [GL ] Using the "OpenGL" graphics system
    [INFO ] [GL ] Backend used <sdl2>
    [INFO ] [GL ] OpenGL version <b'3.0 Mesa 21.2.6'>
    [INFO ] [GL ] OpenGL vendor <b'Intel Open Source Technology Center'>
    [INFO ] [GL ] OpenGL renderer <b'Mesa DRI Intel(R) HD Graphics 4000 (IVB GT2)'>
    [INFO ] [GL ] OpenGL parsed version: 3, 0
    [INFO ] [GL ] Shading version <b'1.30'>
    [INFO ] [GL ] Texture max size <16384>
    [INFO ] [GL ] Texture max units <16>
    [INFO ] [Window ] auto add sdl2 input provider
    [INFO ] [Window ] virtual keyboard not allowed, single mode, not docked
    [INFO ] [ProbeSysfs ] device match: /dev/input/event5
    [INFO ] [MTD ] Read event from </dev/input/event5>
    [INFO ] [Base ] Start application main loop
    [INFO ] [GL ] NPOT texture support is available
    [WARNING] [MTD ] Unable to open device "/dev/input/event5". Please ensure you have the appropriate permissions.

    je ne me suis par encore remis dessus mais je compte comparer plus précautionneusement les deux code.

  9. #8
    umfred

    Re : [Python,Kivy] impossible d utiliser .add_widget


  10. #9
    Dragon999

    Re : [Python,Kivy] impossible d utiliser .add_widget

    Merci pour les MTP ca fait en effet plus propre au lancement.

    Je crois que je dois m avouer vaincu....
    J ai fait correspondre manuellement les deux fichier py en organisant les classe pareil a la même ligne et en important les module même inutilisé.

    Celui la incrémente 100 bouton dans le stack layout a la suite du bouton 'A' et 'B' placer depuis le fichier kv:
    Code:
    from kivy.app import App
    from kivy.metrics import dp
    from kivy.uix.anchorlayout import AnchorLayout
    from kivy.uix.boxlayout import BoxLayout
    from kivy.uix.gridlayout import GridLayout
    from kivy.uix.label import Label
    from kivy.uix.textinput import TextInput
    from kivy.uix.stacklayout import StackLayout
    from kivy.uix.button import Button
    from kivy.uix.widget import Widget
    
    
    class MainWidget(Widget): #Un widget est un controle que l on affiche a l'ecran
        pass
    
    class BoxLayoutExemple(BoxLayout):
        def __init__(self, **kwargs):
            super().__init__(**kwargs)
    
            b1 = Button(text='AAA')  # la syntax est differente (: / =) car le bouton est coder dans le fichier python
            b2 = Button(text='BBB')
            self.add_widget(b1)
            self.add_widget(b2)
    
    
    class AnchorLayoutExemple(AnchorLayout):
        pass
    class StackLayoutExemple(StackLayout):
        def __init__(self, **kwargs):
            super().__init__(**kwargs)
            for i in range(0,100):
                b = Button(text=str(i+1),size_hint=(None,None), size=(dp(60),dp(60) ))
                self.add_widget(b)
    
    
    
    
    class LeLab(App):
    
        pass
    
    
    
    LeLab().run()
    Et celui la pourtant 'visuellement' similaire ce contente des deux boutons mais ignore les addwidget()
    Code:
    from kivy.app import App
    from kivy.metrics import dp
    from kivy.uix.anchorlayout import AnchorLayout
    from kivy.uix.boxlayout import BoxLayout
    from kivy.uix.button import Button
    from kivy.uix.label import Label
    from kivy.uix.textinput import TextInput
    from kivy.uix.gridlayout import GridLayout
    from kivy.uix.stacklayout import StackLayout
    from kivy.uix.widget import Widget
    
    
    class MainWidget(Widget): #Un widget est un controle que l on affiche a l'ecran
        pass
    
    class BoxLayoutExemple(BoxLayout):
        def __int__(self, **kwargs):#**kwargs kivy a bosoin de passer des argument pour fonctionner !!!!!!!
            super().__init__(**kwargs)
    
            b1 = Button(text='A')# la syntax est differente (: / =) car le bouton est coder dans le fichier python
            b2 = Button(text='B')
            self.add_widget(b1)
            self.add_widget(b2)
    
    
    class AnchorLayoutExemple(AnchorLayout):
        pass
    class StackLayoutExemple(StackLayout):
        def __int__(self,**kwargs):
                super().__int__(**kwargs)
                for i in range(0, 100):
                    b = Button(text=str(i + 1), size_hint=(None, None), size=(dp(60), dp(60)))
                    self.add_widget(b)
    
    
    
    
    
    class LeLab(App):
    
        pass
    
    
    
    LeLab().run()
    Le fichier kv
    Code:
    #Widget contenu dynamique
    #BoxLayoutExemple Stack les element sur une seul ligne et defini la taille pour prendre toute la place
    #AnchorLayout stack un element par raport a la fenetre
    #GridLayout placer plusieur element par ligne et par colones
    #StackLayout Stack les element d un taille defini et passe a la ligne
    
    StackLayoutExemple:
    
    
    <MainWidget>:
        Button:
            text:"Hello"
            size:"100dp",'60dp'# 40dp~largeure d un doigt
            pos:'200dp','100dp'
        Label:
            text:"Hello2"
            size:"100dp",'60dp'
            pos:'200dp','160dp'
            color:1,1,0.4,1 #  R,V,B,A
    
    
    <BoxLayoutExemple>:
        orientation:'horizontal'
        Button:
            text:'A'
            #size_hint:None, None # l on indique que l on vas utiliser une taille fix
            # size:"100dp",'60dp'#et on defini la taille fix
            size_hint:0.5, None # w 100%,None l on indique que l on vas utiliser une taille special
            height: '20dp'
            pos_hint: { "center_y" : 0.5  } #pren un parametre par coordoné poin de ref en bas a gauche
                            #x, right, center_x / y, top, center_y
    
        BoxLayout:
            orientation:'vertical'
            spacing: '10dp'#Equivalen du padding??? en css
            Button:
                text:'B1'
            Button:
                text:'B2'
            Button:
                text:'B3'
            Button:
                text:'B4'
        Button:
            text:'B'
            size:"100dp",'60dp'#ignoré le layout deffini la taille
            size_hint:1, 2 #100%, 200% Propiété de taille utiliser dans les layout *_hint utiliser en %(float)
        Button:
            text:'c'
    
    
    <GridLayoutExemple@GridLayout>:
            #Propiété obligatoire
            #   row   --lignes
            #   cols  --colones
        cols:3
        Button:
            text:'A'
            size_hint: None , 1#!!!!!! Passer ces parametre dans le button D qui est dans la meme colonne
            width: '60dp'
    
        BoxLayoutExemple:#on apelle un BoxLayout costruit plus haut
        Button:
            text:'C'
    
        Button:
            text:'D'
            size_hint: None , 1#!!!!!! Passer ces parametre dans le button A qui est dans la meme colonne
            width: '60dp'
        Button:
            text:'E'
    
    <StackLayoutExemple>:
        Button:
            text: 'A'
            size_hint:0.2,0.2
        Button:
            text: 'B'
            size_hint:0.2,0.2

    Vu qu il n y a aucune erreur renvoyer je galère a trouver la source du problème (peut être un espace en trop)Connaisser vous un outil de comparaison de code sous linux?
    Dernière modification par Dragon999 ; 20/04/2022 à 12h29.

  11. #10
    vgondr98

    Re : [Python,Kivy] impossible d utiliser .add_widget

    Etant donné la ligne : [WARNING] [MTD ] Unable to open device "/dev/input/event5". Please ensure you have the appropriate permissions.
    Cela ressemble à un problème de droit.
    Sur linux, on peut faire chmod 777 dans les dossiers pour donner les droits à tout le monde et après avoir vérifié si cela marche, il faut affiner les droits pour éviter les problèmes de sécurité.

  12. #11
    Dragon999

    Re : [Python,Kivy] impossible d utiliser .add_widget

    umfred a donner l'astuce plus haut pour regler ce probleme.

    Cependant ce n est pas ce qui génère l erreur il semblerais que "/dev/input/event5" sous une gestion du multitouche (inexistant sur mon pc) qui est appeler a défaut par kivy ce qui renvoi une erreur sans conséquence.

    le problème semble être ailleurs.

    en tout cas merci pour la commande chmod 777 je n ai pas encor compris comment fonctionne les droit sous linux donc j évite de toucher a ça sans savoir ce que je fais (j ai déjà du faire des réinstalle suite a de mauvaises manip ^^y)

    Le problème ressemble fortement a une erreur de syntax non reconnu par l'IDE

  13. #12
    vgondr98

    Re : [Python,Kivy] impossible d utiliser .add_widget

    Ok, sinon pour comparer deux fichiers, j'ai déjà utilisé cet outil en ligne :https://text-compare.com/fr/ et il marche bien.

  14. #13
    vgondr98

    Re : [Python,Kivy] impossible d utiliser .add_widget

    def __init__(self, **kwargs):

    def __int__(self,**kwargs):

    Par exemple, on voit qu'il manque un i à la ligne 29 et à la ligne 30 et à la ligne 17.
    Dernière modification par vgondr98 ; 20/04/2022 à 14h18.

  15. #14
    umfred

    Re : [Python,Kivy] impossible d utiliser .add_widget

    bien vu
    sous linux, il y a la commande diff pour comparer des fichiers aussi.
    sous ubuntu, il y a aussi le logiciel meld (un peu l'équivalent de winmerge sous windows)

  16. #15
    Dragon999

    Re : [Python,Kivy] impossible d utiliser .add_widget

    WAZAAAAAAAAA Merci les gars (ou les fille )
    Alors la c est un truc qu il faut que je gaffe!!! Je ne pence pas que j aurais trouver de moi même .(Souvent c est comme ça que ça rentre mais parfois être trop têtu tue)

    Et, super cette commande diff ya pas a dire... $ Longue vie a Linux
    Je vais droit installer meld ça a l aire super pratique comme outil (Et éviter du cassage de pied sur le forum pour un i ^^y)

    En tout cas MERCI sa m' enlève une belle épine du pied

    Que la force soit avec vous.

Discussions similaires

  1. Utiliser un afficheur avec une raspberry sur python
    Par TLVD0 dans le forum Programmation et langages, Algorithmique
    Réponses: 2
    Dernier message: 10/06/2021, 12h08
  2. Python Tkinter: Impossible de créer un nouveau bouton
    Par adrienvincent dans le forum Programmation et langages, Algorithmique
    Réponses: 4
    Dernier message: 28/05/2020, 21h24
  3. impossible d'installer Quandl pour python 3.5.3
    Par hary dans le forum Logiciel - Software - Open Source
    Réponses: 1
    Dernier message: 14/06/2017, 20h29
  4. exécution d'un fichier python rattaché à un fichier kivy
    Par roadbecri dans le forum Programmation et langages, Algorithmique
    Réponses: 7
    Dernier message: 24/11/2014, 14h43
  5. impossible d'utiliser le pc
    Par invite47b06757 dans le forum Sécurité et malwares : désinfectez votre machine
    Réponses: 1
    Dernier message: 10/04/2009, 19h23