Encore une fois, très efficace!
J'avais tenté(self,"Info","Blabla") mais pas dans ce sens la
Enfin bref merci beaucoup![]()
Encore une fois, très efficace!
J'avais tenté(self,"Info","Blabla") mais pas dans ce sens la
Enfin bref merci beaucoup![]()
Bonjour Bonjour
Je vous rassure j'ai bientôt terminé la partie graphique, ça sera ma dernière question a ce sujet! ( Normalement)
Avez vous déjà eu l'occasion de devoir utiliser dans vos Applications des tableau?
Ce que j’entends par tableau ce serait pas un tableau excel mais plutôt un tableau que l'on puisse sélectionner ligne par ligne comme une listbox mais a plusieurs colonne en fait?
Parce que je cherche a faire un tableau mais je ne trouve pas vraiment de 'truc' tout fait. J'ai pensé mettre plusieurs listbox les une a coté des autres puis de trouver une solution pour sélectionner toute les lignes dans le cas ou j'en sélectionne une des listbox mais c'est un peu une usine a gaz
Donc j'en reviens a vousComment feriez-vous?
L'utilisation que j'en aurait sera pour lister des désignations de composants avec leur caractéristiques/quantité/prix/etc... si ça peut vous aider a comprendre
Merciiiii![]()
Salut,
Je n'ai peut être pas tout compris mais le widget Treeview devrait répondre tout ou partie à cela.
Cordialement,
- W
Bonsoir,
J'avais trouvé pas mal de truc dans le même genre mais ça demandait a chaque fois d'importer encore un nouveau truc qui n'est pas Tk.
Celui la me plaît bienMerci!
J'ai eu un peu de difficulté a trouver comment l'utiliser mais ça fonctionne comme je le veux c'est bon
La partie graphique est maintenant terminée. Je vais passer a la base de données!
Merci beaucoup pour toute votre aide jusqu’à présent, ça m'a été d'une très grande utilité, merci beaucoup![]()
Bonsoir
Comme je vous l'avais dit, j'ai terminé la partie graphique, mais j'ai maintenant un petit problème a base de texte.
En fait mon programme est pas compliqué, j'ajoute des éléments saisie dans un 'Entry' puis je les supprimes ( le jour ou j'en ai plus besoin ) en le sélectionnant a partir d'un combobox.
Voici mon code réduit pour que vous compreniez![]()
Lorsque je rentre un mot( 'Boite' par exemple ), que je ferme ma fenêtre ( donc que ça s'enregistre dans la BDD), que je la rouvre, puis que je le sélectionne dans la combobox, que je le supprime ; puis que je referme, et rouvre pour voir, tout va bien le mot n'est plus la.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90 # -*- coding: utf-8 -*- import Tkinter as Tk from PIL import Image,ImageTk #sudo apt-get install python-imaging-tk import tkMessageBox import Tix #sudo apt-get install tix import ttk import sqlite3 class FenRangement(Tix.Tk): def __init__(self,event=None): Tix.Tk.__init__(self) self.initialize() self.mainloop() def initialize(self): #Creation de la fenetre principale self.title('Rangement') self.geometry("%dx%d+%d+%d" %(180,250,((self.winfo_screenwidth()-180)/2),((self.winfo_screenheight()-250)/2)+58)) self.resizable(width=False, height=False) ################################## #Affichage fond et icone self.can = Tix.Canvas(self,width = 180, height = 250, bd=10,relief=Tix.RIDGE) self.can.create_text(90,30,text="Rangements disponible :",fill='black',font='Times 11') self.varcombo = Tix.StringVar() self.comboR = Tix.ComboBox(self.can, editable=1, dropdown=1, variable=self.varcombo,relief=Tix.GROOVE) self.comboR.entry.config(state='readonly')## met la zone de texte en lecture seule self.comboR.subwidget( "slistbox" ).config( width = 9 ) self.comboR.subwidget("label" ).destroy() self.comboR.place(x=15,y=60,width=150) Tix.Button(self.can,text="Supprimer",command=self.suppression).place(x=43,y=110,width=95) self.EntryAjouter = Tix.Entry(self.can) self.EntryAjouter.place(x=15,y=160,width = 150) Tix.Button(self.can,text="Ajouter",command=self.ajout).place(x=20,y=200,width=70) Tix.Button(self.can,text="Fermer",command=self.fermer).place(x=90,y=200,width=70) self.can.pack() ######################## #Remplissage combobox self.rempcombobox() ##################### def rempcombobox(self): # Remplissage de la Combobox self.BDD = sqlite3.connect("StockBDD.sq3") # Connection a la BDD self.BDDcurseur = self.BDD.cursor() # Création du curseur try: # Test si BDD existante self.BDDcurseur.execute("SELECT emplacement FROM rangements") for i in self.BDDcurseur: self.comboR.insert(Tix.END,i) except: # Création de la BDD le cas échéant self.BDDcurseur.execute("CREATE TABLE rangements ( emplacement TEXT )") def fermer(self): # Permet d'enregistrer les changement de la BDD puis fermer la fenetre self.BDD.commit() self.BDDcurseur.close() self.BDD.close() self.destroy() def suppression(self): #suppression de l'élément selectionné dans la liste et de l'entry puis de la BDD txtsuppression = self.varcombo.get() if txtsuppression is not "": self.comboR.entry.config(state='normal') # Suppression du text dans l'entry self.comboR.subwidget_list['entry'].delete(0,Tix.END) #IDEM self.comboR.entry.config(state='readonly')#END try: # test dans le cas ou l'élément à supprimer l'a déjà été self.BDDcurseur.execute("DELETE FROM rangements WHERE emplacement=(?)",(txtsuppression,)) # Suppression de l'élement selectionné dans la BDD self.indexsupp = self.comboR.subwidget_list['slistbox'].subwidget_list['listbox'].curselection() # Suppression de la valeur dans la listbox self.comboR.subwidget_list['slistbox'].subwidget_list['listbox'].delete( first=self.indexsupp , last=None )#IDEM except: tkMessageBox.showerror("Erreur","Impossible de supprimer l'élément. \n (Elément déjà supprimé?)",parent=self) else: tkMessageBox.showerror("Erreur","Veuillez saisir un rangement a supprimer",parent=self) #Aucune selection def ajout(self): # ajout d'un nouvel élement txtajout = self.EntryAjouter.get() if txtajout is not "": self.BDDcurseur.execute("INSERT INTO rangements( emplacement ) VALUES(?)",(txtajout,)) # ajout a la BDD self.comboR.insert(Tix.END,txtajout) #ajout dans la listbox self.EntryAjouter.delete(0,Tix.END) #effacement de l'entry else: tkMessageBox.showerror("Erreur","Veuillez saisir un rangement a ajouter",parent=self) if __name__ == "__main__": FenRangement()
Mais par contre, lorsque je rentre 2 mots ('Boite Noire' par exemple), que je ferme la fenêtre ( ca s'enregistre encore ), que je rouvre, que je les sélectionnes dans la combobox (Déjà la, ils sont entouré d'accolades , ça commence mal), puis que je les supprimes, ça ne fonctionne plus...
Mon avis, est que je ne peux pas supprimer car mon programme cherche dans le cas ci dessus '{Boite Noire}' au lieu de 'Boite Noire' ; Forcement il ne le trouve pas, donc il ne le supprime pas.
Je suppose que le problème viens au moment ou la combobox est remplie ( méthode rempcombobox ) mais alors pourquoi ça fait ça je ne sais pas.
J'en viens donc a vous
Merci d''avance
Salut,
Ayant écrit "SELECT emplacement FROM rangements" vous pourriez espérez recevoir une liste de "string"... En fait, SELECT remonte toujours une liste éventuellement vide de "rows". Et ces rows sont des "tuple".Je suppose que le problème viens au moment ou la combobox est remplie ( méthode rempcombobox ) mais alors pourquoi ça fait ça je ne sais pas.
Pratiquement, ce n'est pas 'Boite Noire' mais ('Boite Noire', ) qui est passée à .insert. Pourquoi TK s'arrange-t-il mieux de ('Boite', ) que de ('Boite Noire', )? En première approximation, je dirais "garbage in => garbage out"...
Tout çà pour dire qu'écrire:
devrait le faire.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 def rempcombobox(self): # Remplissage de la Combobox self.BDD = sqlite3.connect("StockBDD.sq3") # Connection a la BDD self.BDDcurseur = self.BDD.cursor() # Création du curseur try: # Test si BDD existante self.BDDcurseur.execute("SELECT emplacement FROM rangements") for i in self.BDDcurseur: self.comboR.insert(Tix.END, i[0]) except: # Création de la BDD le cas échéant self.BDDcurseur.execute("CREATE TABLE rangements ( emplacement TEXT )")
- W
En effet j’espérais recevoir une liste de string ; Cela fonctionne très bien comme vous l'avez dit, même si cela me surprend tout de même qu'il faut indiquer 'l'indice' de ce qu'on veut.
Enfin bref, comme d'habitude, merci beaucoup pour votre aide, je cherchais depuis le début d’après-midi plutôt vers le formatage de la chaîne en string mais sans succès, j'obtenais des '(Boite Noire',) , je trouvais ça encore plus loin que ce que je voulais
Merci beaucoup, bonne soirée a vous![]()
Bonsoir wiztricks et tout le monde
Aujourd'hui, encore un nouveau petit problème , voici un petit code qui en dira beaucoup :
En fait, lorsque je clique sur 'un clic' dans le menu déroulant, j'appelle 2 fois la méthode 'clic'. Une fois a l'appuie sur le bouton de la souris, et une autre fois au relâchement du bouton.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 import Tkinter as Tk import Tix class FenRangement(Tix.Tk): def __init__(self,event=None): Tix.Tk.__init__(self) self.initialize() self.mainloop() def initialize(self): self.varcombo = Tix.StringVar() self.comboR = Tix.ComboBox(self, editable=1, command = self.clic, variable=self.varcombo,relief=Tix.GROOVE) self.comboR.place(x=15,y=60,width=150) self.comboR.insert(Tix.END,'Un clic') def clic(self,event=None): print "1 clic" if __name__ == "__main__": FenRangement()
Or bien sur, je ne souhaite qu'un seul appel de la fonction.
J'ai bien tenté un bind (<Button-1>,self.clic) mais la fonction n'est même pas appelé.
J'ai tenté quelque autre truc qui n'ont pas fonctionné non plus.
Le comportement de la combobox m'impressionne quand même, c'est pratique de 'capter' le clic et le relâchement mais lorsque l'on en souhaite qu'un, c'est pas pratique du tout)
Autre chose, connaissez-vous un moyen de supprimer l'intégralité du contenu d'un TreeView de façon rapide?
D'avance, Merci beaucoup pour votre aide, c'est vraiment sympa de votre part d'aider les gens du forum. Merci a vous.
Salut,
Voilà une question qu'elle est bonne!
Je n'ai pas eu la chance d'avoir à pratiquer ce widget.
De fait, il est "compliqué".
Pour comprendre "comment l'utiliser", il faut se mettre en situation "que faire avec" (des cas d'utilisation) et voir comment l'API proposée nous permet de résoudre le problème simplement.
Dit autrement, ok, ce comportement est "strange"...
Mais au delà, est ce que cela vous handicape pour faire quelque chose de particulier? Et/ou est ce que la méthode que vous vous proposez pour traiter le cas d'utilisation est "en ligne" avec ce que propose le widget?
Je vous suggère de poser la question directement dans le forum: un lecteur inspiré aura peut être une réponse plus satisfaisante.
Pour ttk.Treeview, c'est plus simple:
- W
Code : Sélectionner tout - Visualiser dans une fenêtre à part tv.delete(*tv.get_children(''))
Bonsoir Bonsoir
A vrai dire, le combobox permet d'afficher dans la treeview les valeurs correspondantes au choix de la combobox. Comme la treeview, est effacée a chaque appel je ne le vois pas donc ca me va
Aujourd'hui je cherche a comprendre le joker en python :
Il n'est pas censé m'afficher 'Egal'? Comment fonctionne le joker en python, je crois que je n'ai pas tout compris
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 a=220 if str(a) == str(22) + "*": print "Egal" else: print "Différent"
J'ai tenté des \* et d'autre chose sans succes, et sur google, essayé de mettre '* python' pour voirIl vous met tout ce qui fin par 'python'
![]()
Merci d'avance![]()
Bonjour,
Vous travaillez ici sur des string et '22' + '*' cela donne '22*'
Vous comprendrez bien que '220' est définitivement différent de '22*'.
Si vous voulez faire des comparaisons vous devez passer par les méthodes de l'objet string.
Pour quelque chose de plus 'compliqué' vous pouvez vous tourner vers re.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 >>> '22*'.startswith('22') True >>> '22*'.endswith('2*') True >>> a = '220' >>> b = str(22) + "*" >>> a[:2] '22' >>> a[:2] == b[:2] True
C'est le *tv.get_children('') de wiztricks qui vous gène ? * est utilisé ici pour envoyer un tuple des résultats de .get_children('') à .delete.
Voici un exemple basé sur le fait qu'en Python 3 print est une fonction:
Vous trouverez pas mal de doc sur le sujet, y compris dans la doc sur les fonctions en python pour ce qui est des arguments à longueur variable (* et **).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 >>> l = [0, 1, 2, 3] >>> print(*l) 0 1 2 3 >>> s = 'abcd' >>> print(*s) a b c d
@+
Bonjour,
Les 'Widgets' Tix sont composites et tout command est passé aux subwidgets.
@+
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 import Tkinter as Tk import Tix class FenRangement(Tix.Tk): def __init__(self,event=None): Tix.Tk.__init__(self) self.initialize() self.mainloop() def initialize(self): self.varcombo = Tix.StringVar() self.comboR = Tix.ComboBox(self, editable=1, variable=self.varcombo,relief=Tix.GROOVE) [w.bind('<1>', self.clic1) for w in self.comboR.subwidgets_all() if isinstance(w, Tix._dummyListbox)] self.comboR.place(x=15,y=60,width=150) self.comboR.insert(Tix.END,'Un clic') def clic(self,event=None): print "1 clic" def clic1(self,event=None): print "1 clic..." if __name__ == "__main__": FenRangement()
[w.bind('<1>', self.clic1) for w in self.comboR.subwidgets_all() if isinstance(w, Tix._dummyListbox)]
self.comboR.subwidget("listbox").bind('<1>', self.clic1)
Bonjour,
Quelques petits print/after pour voir ce qui se passe:
On vois bien que command est stocké dans .
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 import Tkinter as Tk import Tix class FenRangement(Tix.Tk): def __init__(self,event=None): Tix.Tk.__init__(self) self.initialize() self.mainloop() def initialize(self): self.varcombo = Tix.StringVar() self.comboR = Tix.ComboBox(self, editable=1, command=self.clic, variable=self.varcombo, relief=Tix.GROOVE) for w in self.comboR.subwidgets_all(): if hasattr(w, 'command'): print w #self.comboR.deletecommand(*self.comboR._tclCommands) self.comboR.place(x=15,y=60,width=150) self.comboR.insert(Tix.END,'Un clic') self.comboR.insert(Tix.END,'Deux clics') self.comboR.insert(Tix.END,'Trois clics') def clic(self,event=None): print "clic" self.after(1000) if __name__ == "__main__": FenRangement()
Le blocage par after nous montre bien deux events: La sélection dans la Lisbox et l'insertion dans le Label. De même si le contenu de la Listbox ne change pas nous auront qu'un seul 'clic'.
le deletecommand montre bien les deux events et un seul callback (la fonction 'clic') stocké.
@+
Petit bonus:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 import Tkinter as Tk import Tix class FenRangement(Tix.Tk): def __init__(self,event=None): Tix.Tk.__init__(self) self.initialize() self.mainloop() def initialize(self): self.varcombo = Tix.StringVar() self.comboR = Tix.ComboBox(self, editable=1, variable=self.varcombo, relief=Tix.GROOVE, selectmode=Tix.BROWSE, browsecmd=self.clic) self.comboR.place(x=15, y=60, width=150) self.comboR.insert(Tix.END,'Un clic') self.comboR.insert(Tix.END,'Deux clics') self.comboR.insert(Tix.END,'Trois clics') def clic(self,event=None): print "clic" if __name__ == "__main__": FenRangement()BINDINGS
[1]
If the -selectmode is "immediate", when the user enters a keystroke, clicks on an item or drags the mouse pointer in the listbox, the -value of the ComboBox will be immediately set to this item and the -command procedure will be called.
[2]
If the -selectmode is "browse", when the user enters a keystroke, clicks on an item or drags the mouse pointer in the listbox, the -selection of the ComboBox will be immediately set to the new content of the entry subwidget; also the -browsecmd procedure will be called. The -value option will be changed only when the user invokes the ComboBox (see [3] below). If the user presses the <Escape> key at any time, any new -selection will be ignored and the text inside the entry subwidget will be restored to the current -value of the ComboBox.
[3]
If the -dropdown option is true, the user can invoke the ComboBox by releasing the left mouse button over the desired item in the listbox. If the -dropdown option is false, the user can invoke the ComboBox by double-clicking over the desired item in the listbox. In both cases, the user can also invoke the listbox by pressing the <Return> or <Tab> key inside the entry subwidget, or switching the input focus to another widget inside the same toplevel widget
Et une petite explication sur ceci:
Si l'on considère que f est ici notre Combobox et l un de ses subwidgets vous remarquerez vous devez cliquer sur le rouge (que vous voyez grâce aux padx/pady) pour que le bind sur f soit effectif.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 import Tkinter as Tk def OnClic(event): print event.widget root = Tk.Tk() f = Tk.Frame(root, bg='red') l = Tk.Label(f, text='Clic on me !') l.pack(padx=5, pady=5) f.pack() l.bind('<1>', OnClic) f.bind('<1>', OnClic) print f print l root.mainloop()
Pour 'propager' le bind on utilise bind_all
C'est le même principe pour Tix.Combobox: Les subwidgets sont 'au dessus'
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 import Tkinter as Tk def OnClic(event): print event.widget root = Tk.Tk() f = Tk.Frame(root, bg='red') l = Tk.Label(f, text='Clic on me !') l.pack(padx=5, pady=5) f.pack() f.bind_all('<1>', OnClic) print f print l root.mainloop()
@+
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 import Tkinter as Tk import Tix class FenRangement(Tix.Tk): def __init__(self,event=None): Tix.Tk.__init__(self) self.initialize() self.mainloop() def initialize(self): self.varcombo = Tix.StringVar() self.comboR = Tix.ComboBox(self, editable=1, variable=self.varcombo, relief=Tix.GROOVE, selectmode=Tix.BROWSE, browsecmd=self.clic) self.comboR.place(x=15, y=60, width=150) self.comboR.bind_all('<1>', self.OnClic) self.comboR.insert(Tix.END,'Un clic') self.comboR.insert(Tix.END,'Deux clics') self.comboR.insert(Tix.END,'Trois clics') def OnClic(self, event): print event.widget def clic(self, event=None): print "clic" if __name__ == "__main__": FenRangement()
Un autre fait que le bind ne fonctionne pas: Tix.Combobox hérite de TixWidget qui lui même hérite de Tkinter.Widget (et donc de Misc). Il a donc les options hérités mais pas d'"existence physique" à l'écran. Seuls les subwidgets sont des objets graphiques tcl/tk.
Difficile de faire un clic sur quelque chose qui n'est pas à l'écran...
(Annule le post plus haut)
Bonjour tout le monde
J'ai terminé le programme que je voulais faire, merci a ceux qui m'ont aidé dans le développement de celui ci, ça aurait été beaucoup plus compliqué (et très long!) sans votre aide
Bien sur, il y a eu quelque surprise quand j'ai commencé a rentrer mon stock mais maintenant tout fonctionne très bien.
Le prochain programme, je m'attaque a un port série virtuel ( Via USB )
Sur ce, bonne journée
PS : Merci PauseKawa pour ces nombreuses explications. J'ai corrigé pas mal de ligne![]()
Partager