-
Notifications
You must be signed in to change notification settings - Fork 0
/
sec-Layout.html
190 lines (185 loc) · 8.94 KB
/
sec-Layout.html
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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>10.4. Le conteneur Layout (Affiche)</title>
<link rel="stylesheet" href="pygtktutfr.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.69.1">
<link rel="start" href="index.html" title="Tutoriel PyGTK 2.0">
<link rel="up" href="ch-ContainerWidgets.html" title="Chapitre 10. Les widgets conteneurs">
<link rel="prev" href="sec-Fixed.html" title="10.3. Le conteneur Place (Fixed)">
<link rel="next" href="sec-Frames.html" title="10.5. Les cadres (Frame)">
<meta name="keywords" content="python,pygtk,tutoriel,traduction">
<link rel="home" href="index.html" title="Table des matières">
</head>
<body>
<div class="localisation">
Vous êtes à peu près ici :
<a href="../../index.html">Accueil</a> »
<a href="../pygtktut.php">tutoriel PyGTK</a> »
<a href="index.html">PyGTK : sommaire</a>
</div>
<!-- fin localisation -->
<div class="navheader">
<table width="100%" summary="Navigation header">
<tr><th colspan="3" align="center">10.4. Le conteneur Layout (Affiche)</th></tr>
<tr>
<td width="20%" align="left">
<a accesskey="p" href="sec-Fixed.html">Préc.</a> </td>
<th width="60%" align="center">Chapitre 10. Les widgets conteneurs</th>
<td width="20%" align="right"> <a accesskey="n" href="sec-Frames.html">Suiv.</a>
</td>
</tr>
</table>
<hr>
</div>
<div class="sect1" lang="fr">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
<a name="sec-Layout"></a>10.4. Le conteneur Layout (Affiche)</h2></div></div></div>
<p>Le conteneur <code class="classname">Layout</code> ressemble au conteneur
<code class="classname">Fixed</code> à ceci près qu'il implémente
une zone défilable infinie (un infini limité à 2^32). Le système X window
possède une limitation de taille de fenêtre de 32767x32767 pixels. Le
conteneur <code class="classname">Layout</code> tourne cette limitation en
réalisant des trucs exotiques utilisant la gravité de fenêtre et de bit.
Il devient ainsi possible d'obtenir un défilement régulier même lorsque
l'on a plein de widgets enfants dans la zone de défilement.
</p>
<p>On crée un conteneur<code class="classname">Layout</code> par :</p>
<pre class="programlisting">
affiche = gtk.Layout(<strong class="parameter"><code>hadjustment</code></strong>=None, <strong class="parameter"><code>vadjustment</code></strong>=None)
</pre>
<p>Comme on peut le constater, il est possible d'indiquer,
de manière facultative, des objets <code class="classname">Adjustment</code>,
(voir <a href="ch-Adjustments.html" title="Chapitre 7. Adjustments">Chapitre 7, <i>Adjustments</i></a>) que le widget
<code class="classname">Layout</code> va utiliser pour son défilement. Si
l'on ne précise pas d'objets <code class="classname">Adjustment</code>, des
nouveaux seront créés automatiquement.
</p>
<p>On peut ajouter et déplacer des widgets dans un
conteneur <code class="classname">Layout</code> avec les méthodes
suivantes :</p>
<pre class="programlisting">
affiche.put(<strong class="parameter"><code>widget_enfant</code></strong>, <strong class="parameter"><code>x</code></strong>, <strong class="parameter"><code>y</code></strong>)
affiche.move(<strong class="parameter"><code>widget_enfant</code></strong>, <strong class="parameter"><code>x</code></strong>, <strong class="parameter"><code>y</code></strong>)
</pre>
<p>On peut indiquer ou connaître la taille du conteneur
<code class="classname">Layout</code> en utilisant les méthodes :</p>
<pre class="programlisting">
affiche.set_size(<strong class="parameter"><code>largeur</code></strong>, <strong class="parameter"><code>hauteur</code></strong>)
taille = layout.get_size()
</pre>
<p>Ces quatres dernières méthodes du widget <code class="classname">Layout</code>
permettent de manipuler les widgets d'ajustement horizontal et vertical :</p>
<pre class="programlisting">
horiz_ajust = affiche.get_hadjustment()
vert_ajust = affiche.get_vadjustment()
affiche.set_hadjustment(<strong class="parameter"><code>ajustement</code></strong>)
affiche.set_vadjustment(<strong class="parameter"><code>ajustement</code></strong>)
</pre>
<p>Le programme <a href="exemples/layout.py" target="_top"><span><strong class="command">
layout.py</strong></span></a> crée trois boutons et les place dans un
conteneur <code class="classname">Layout</code> affiche. Quand on clique sur
l'un des boutons, il est transféré à un nouvel emplacement, aléatoire,
dans le conteneur. La <a href="sec-Layout.html#layoutfig" title="Figure 10.3. Exemple de conteneur Layout">Figure 10.3, « Exemple de conteneur Layout »</a>montre l'affichage de départ.
</p>
<div class="figure">
<a name="layoutfig"></a><p class="title"><b>Figure 10.3. Exemple de conteneur Layout</b></p>
<div class="mediaobject" align="center"><img src="figures/layout.png" align="middle" alt="Exemple de conteneur Layout"></div>
<span>Exemple de conteneur Layout</span>
</div>
<p>Voici le code source du programme <a href="exemples/layout.py" target="_top">
<span><strong class="command">layout.py</strong></span></a> :</p>
<pre class="programlisting">
1 #!/usr/bin/env python
2 # -*- coding:utf-8 -*-
3 # exemple layout.py
4
5 import pygtk
6 pygtk.require('2.0')
7 import gtk
8 import random
9
10 class ExempleAffiche:
11 def WindowDeleteEvent(self, widget, event):
12 # retourne False pour que la fenêtre soit détruite
13 return False
14
15 def WindowDestroy(self, widget, *data):
16 # quitte la boucle principale
17 gtk.main_quit()
18
19 def ButtonClicked(self, bouton):
20 # déplace le bouton
21 self.affiche.move(bouton, random.randint(0,500),
22 random.randint(0,500))
23
24 def __init__(self):
25 # crée la fenêtre de niveau supérieur
26 fenetre = gtk.Window(gtk.WINDOW_TOPLEVEL)
27 fenetre.set_title("Exemple conteneur Layout")
28 fenetre.set_default_size(300, 300)
29 fenetre.connect("delete-event", self.WindowDeleteEvent)
30 fenetre.connect("destroy", self.WindowDestroy)
31 # crée une table et la place dans la fenêtre
32 table = gtk.Table(2, 2, False)
33 fenetre.add(table)
34 # crée le conteneur affiche affiche et le place dans la table
35 self.affiche = gtk.Layout(None, None)
36 self.affiche.set_size(600, 600)
37 table.attach(self.affiche, 0, 1, 0, 1, gtk.FILL|gtk.EXPAND,
38 gtk.FILL|gtk.EXPAND, 0, 0)
39 # crée les barres de défilement et les place dans la table
40 vert_defil = gtk.VScrollbar(None)
41 table.attach(vert_defil, 1, 2, 0, 1, gtk.FILL|gtk.SHRINK,
42 gtk.FILL|gtk.SHRINK, 0, 0)
43 horiz_defil = gtk.HScrollbar(None)
44 table.attach(horiz_defil, 0, 1, 1, 2, gtk.FILL|gtk.SHRINK,
45 gtk.FILL|gtk.SHRINK, 0, 0)
46 # les barres de défilement utilisent les ajustements du conteneur
47 vAdjust = self.affiche.get_vadjustment()
48 vert_defil.set_adjustment(vAdjust)
49 hAdjust = self.affiche.get_hadjustment()
50 horiz_defil.set_adjustment(hAdjust)
51 # crée 3 boutons et les place dans le conteneur
52 bouton = gtk.Button("Clic !")
53 bouton.connect("clicked", self.ButtonClicked)
54 self.affiche.put(bouton, 0, 0)
55 bouton = gtk.Button("Clic !")
56 bouton.connect("clicked", self.ButtonClicked)
57 self.affiche.put(bouton, 100, 0)
58 bouton = gtk.Button("Clic !")
59 bouton.connect("clicked", self.ButtonClicked)
60 self.affiche.put(bouton, 200, 0)
61 # Montre tous les widgets
62 fenetre.show_all()
63
64 def main():
65 # on entre dans la boucle principale
66 gtk.main()
67 return 0
68
69 if __name__ == "__main__":
70 ExempleAffiche()
71 main()
</pre>
</div>
<div class="navfooter">
<hr>
<table width="100%" summary="Navigation footer">
<tr>
<td width="40%" align="left">
<a accesskey="p" href="sec-Fixed.html">Préc.</a> </td>
<td width="20%" align="center"><a accesskey="u" href="ch-ContainerWidgets.html">Chapitre parent</a></td>
<td width="40%" align="right"> <a accesskey="n" href="sec-Frames.html">Suiv.</a>
</td>
</tr>
<tr>
<td width="40%" align="left" valign="top">10.3. Le conteneur Place (Fixed) </td>
<td width="20%" align="center"><a accesskey="h" href="index.html">Sommaire</a></td>
<td width="40%" align="right" valign="top"> 10.5. Les cadres (Frame)</td>
</tr>
</table>
</div>
</body>
</html>