Salut,
Je me bats toujours avec Tix. Il est dit dans la doc qu'un widget tix hérité de tkinter s'utilise comme un widget tkinter. J'ai supposé que tix.ScrolledText était hérité de tkinter.Text. Ça ne me parait pas vraiment possible. Par exemple la méthode 'insert' de Tkinter.Text a disparu de Tix.ScrolledText ...
A+
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
91 import Tix as tix import xml.etree.ElementTree as ET class XML_TREE(tix.Frame): def __init__(self, container, xml_doc, *args, **kwds): if not 'width' in kwds.keys():kwds['width'] = 320 if not 'height' in kwds.keys():kwds['height'] = 480 tix.Frame.__init__(self, container) self.tree = tix.Tree(self, *args, **kwds) self.obj_frm = None self.objects = {} self.tree.hlist.config(bg='white', fg='black', selectbackground='black', selectforeground='white') self.idx = 0 self.buildTree(xml_doc.getroot()) self.tree.autosetmode() self.tree['browsecmd'] = lambda dir=None: self.browsecmd(dir) self.switch = 0 self.tree.grid(column=0, row=0) self.properties = tix.ScrolledText(self, width=kwds['width']*2, height=kwds['height']) self.properties.grid(column=1, row=0) toto = dir(self.properties) for item in toto: print item def isInteger(self, text): for car in text: if not car in ('1234567890'): return False return True def getIdx(self): retstr = str(self.idx) self.idx += 1 return retstr def buildTree(self, element, dir=None, deep=0): if dir == None: dir = self.getIdx() # builds element self.tree.hlist.add(dir, itemtype=tix.IMAGETEXT, text=element.tag, image=self.tk.call('tix', 'getimage', 'folder')) # builds element's text if element.text != None: text = element.text.strip() if text != '': self.tree.hlist.add(dir + '.' + 'TEXT', itemtype=tix.IMAGETEXT, text="TEXT", image=self.tk.call('tix', 'getimage', 'file')) # builds element's attributes for key in element.attrib.keys(): tempdir = dir + '.' + key self.tree.hlist.add(tempdir, itemtype=tix.IMAGETEXT, text=key, image=self.tk.call('tix', 'getimage', 'file')) # builds element's children for subelement in element: tempdir = dir + '.' + self.getIdx() self.buildTree(subelement, tempdir, deep+1) self.objects[dir] = element def browsecmd(self, dir): self.switch ^= 1 if self.switch: return words = dir.split('.') parent = '.'.join(words[:-1]) child = words[-1] if not self.isInteger(child): obj = self.objects[parent] else: obj = self.objects[dir] text = ET.dump(obj) self.properties.insert(text) print text #~ self.properties.delete('1.0', 'end') if __name__ == "__main__": import tkFileDialog as tkfd def getProperties(): pass win = tix.Tk() #~ fname = tkfd.askopenfilename(initialdir='.\\', initialfile='noname.xml', filetypes=[("All", ".*"), ("XML files", ".xml")], title='Select xml file', parent=win) fname = './test.xml' if fname != None and fname != '': xml_tree = ET.parse(fname) tree = XML_TREE(win, xml_tree) tree.grid() win.deiconify() win.resizable(height=False, width=False) win.mainloop()
Pfeuh
Bon, je me suis vraisemblablement noyé dans un verre d'eau, l'équivalent du tk.Text est un subwidget de tix.ScrolledText. Je l'ai trouvé grâce à la méthode children()
A+
Code : Sélectionner tout - Visualiser dans une fenêtre à part {'hsb': <Tix._dummyScrollbar instance at 0x02342030>, 'text': <Tix._dummyText instance at 0x0233BFA8>, 'vsb': <Tix._dummyScrollbar instance at 0x0233BFD0>}
Pfeuh
Salut,
La documentation Python est trop rudimentaire.
Essayez d'avoir le réflexe de lire les documentations TCL associées.
Pour ScrolledText, les subwidgets sont mentionnés.
Nota, si vous utilisiez Qt, vous auriez aussi à regarder les détails de ce que font les classes C++ et traduire "à la volée" le codage Python qui correspond.
- W
Salut,
J'ai hésité à créer un nouveau topic, puis je me suis dit que c'était directement dans la continuité des autres posts... Tix me balance le message ci dessous deux fois pour ce script et ne me dessine pas le label du LabelFrame:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 (TixForm) Error:Trying to use more than one geometry manager for the same master window. Giving up after 50 iterations.Rien de bien méchant niveau code, mais tout se passe comme si je n'avais pas le droit d'utiliser la méthode grid parce qu'une autre est déjà utilisée. Il suffit de commenter la ligne 6 pour s'en rendre compte. Autre problème, pour un LabelFrame, le label s'appelle 'text' en Tk mais 'label' en Tix... Bref, il faut quand même avouer qu'il ne suffit pas de remplacer 'Tkinter' pas 'Tix' pour passer d'une librairie à l'autre.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 import Tix as tix win = tix.Tk() frm = tix.LabelFrame(win, label='Blablabla...') frm.grid() entry = tix.Entry(frm, width=80) entry.grid() win.mainloop()
La solution serait donc de mélanger des objets Tkinter et Tix?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 import Tix as tix import Tkinter as tk win = tix.Tk() frm = tk.LabelFrame(win, text='Blablabla...') frm.grid() entry = tk.Entry(frm, width=80) entry.grid() win.mainloop()
A+
Pfeuh
Ou lire la doc
CREATING WIDGETS INSIDE A LABELFRAME
The LabelFrame widget packages a frame widget and a label into one mega widget. To create widgets inside a LabelFrame widget, one must create the new widgets relative to the frame subwidget and manage them inside the frame subwidget. An error will be generated if one tries to create widgets as immediate children of the LabelFrame. For example: the following is correct code, which creates new widgets inside the frame subwidget:
tixLabelFrame .f
set f [.f subwidget frame]
button $f.b -text hi
pack $f.b
The following example code is incorrect because it tries to create immediate children of the LabelFrame .f:
tixLabelFrame .f
# wrong!
button .f.b -text hi
pack .f.b
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 import Tix as tix win = tix.Tk() frm = tix.LabelFrame(win, label='Blablabla...') frm.grid() for w in frm.subwidget_list: print(w, frm.subwidget_list[w], frm.subwidget_list[w].winfo_manager()) entry = tix.Entry(frm.subwidget_list['frame'], width=80) entry.grid() win.mainloop()
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 ('frame', <Tix._dummyFrame instance at 0xb76a542c>, 'tixForm') ('label', <Tix._dummyLabel instance at 0xb76a024c>, 'tixForm')@+# The Tix 'tixForm' geometry manager
class Form:
"""The Tix Form geometry manager
Widgets can be arranged by specifying attachments to other widgets.
See Tix documentation for complete details"""
...
Merci d'utiliser le forum pour les questions techniques.
Bonjour,
Dans la réponse j'ai laisser de coter la méthode pour rester dans une optique 'widget composite/mega widget' mais:
@+
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 import Tix as tix win = tix.Tk() frm = tix.LabelFrame(win, label='Blablabla...') frm.grid() entry = tix.Entry(frm.subwidget('frame'), width=80) entry.grid() win.mainloop()
Merci d'utiliser le forum pour les questions techniques.
Merci pour cette réponse qui me montre que j'aurais pu trouver tout seul l'histoire du subwidget... S'il n'y a pas de contre indication, je préfère continuer de mélanger les widgets tkinter et tix et à croire naïvement que tix est une simple surcouche de tkinter.
A+
Pfeuh
Bonjour,
A vrais dire il n'y a pas vraiment de 'mélange' dans le code présenté.
Et du coup Tix en perd de son intérêt.
Du fait de l'import from Tkinter import * de Tix.py vous pouvez ici directement écrire
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 import Tix as tix win = tix.Tk() frm = tix.LabelFrame(win, label='Blablabla...') frm.grid() entry = tix.Entry(frm.subwidget('frame'), width=80) entry.grid() print(locals()) win.mainloop()Le Widget Entry de Tkinter n'étant pas surchargé par Tix.py.{'tix': <module 'Tix' from '/usr/lib/python2.6/lib-tk/Tix.pyc'>, '__builtins__': <module '__builtin__' (built-in)>, 'win': <Tix.Tk instance at 0xb7774c6c>, '__file__': 'calcul.py', 'frm': <Tix.LabelFrame instance at 0xb777762c>, '__package__': None, 'entry': <Tkinter.Entry instance at 0xb74c13cc>, '__name__': '__main__', '__doc__': None}
L'écriture tk.<widget>/tix.<widget> reste toutefois on ne peut plus explicite pour le lecteur.
@+
Merci d'utiliser le forum pour les questions techniques.
Petit détail sur les imports de Tix au passage:
Tix.py:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 from Tkinter import * from Tkinter import _flatten, _cnfmerge, _default_root # WARNING - TkVersion is a limited precision floating point number if TkVersion < 3.999: raise ImportError, "This version of Tix.py requires Tk 4.0 or higher" import _tkinter # If this fails your Python may not be configured for Tk ... import Tkinter, os
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 import Tix as tix win = tix.Tk() frm = tix.Tkinter.LabelFrame(win) print(locals()){'tix': <module 'Tix' from '/usr/lib/python2.6/lib-tk/Tix.pyc'>, '__builtins__': <module '__builtin__' (built-in)>, 'win': <Tix.Tk instance at 0xb7724aec>, '__file__': 'calcul.py', 'frm': <Tkinter.LabelFrame instance at 0xb77275ec>, '__package__': None, '__name__': '__main__', '__doc__': None}
Merci d'utiliser le forum pour les questions techniques.
Merci pour ces éclaircissements.
Dans le code présenté, non, effectivement. J'essaie d'utiliser Tix uniquement pour les widgets Tree et CheckList, le reste m'indiffère un peu. Les widgets avec scrollbars, par exemple, il y a belle lurette que je les fait en tkinter.
C'est effectivement plus élégant de ne garder que Tix... Mais qu'en est-il des librairies que j'utilise depuis des années et qui ne font référence qu'à tkinter? Je pense que la méthode consistant à mélanger ne demande aucune modification de ces scripts, ce qui est quand même important pour moi.
Code : Sélectionner tout - Visualiser dans une fenêtre à part entry = tix.Entry(frm.subwidget('frame'), width=80)
A+
Pfeuh
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager